Datum und Uhrzeit#

Mit pandas könnt ihr Series mit Datums- und Zeitinformationen erstellen. Im folgenden werden wir häufige Operationen mit Datumsdaten zeigen.

Hinweis

pandas unterstützt Datumsangaben, die in UTC-Werten gespeichert sind und den Datentyp datetime64[ns] verwenden. Es werden auch lokale Zeiten aus einer einzigen Zeitzone unterstützt. Mehrere Zeitzonen werden durch ein pandas.Timestamp-Objekt unterstützt. Wenn ihr mit Zeiten aus mehreren Zeitzonen hantieren müsst, würde ich die Daten vermutlich nach Zeitzonen aufteilen und für jede Zeitzone einen eigenen DataFrame oder eine eigene Series verwenden.

Laden von UTC-Zeitdaten#

[1]:
import pandas as pd


dt = pd.date_range("2022-03-27", periods=6, freq="H")

dt
[1]:
DatetimeIndex(['2022-03-27 00:00:00', '2022-03-27 01:00:00',
               '2022-03-27 02:00:00', '2022-03-27 03:00:00',
               '2022-03-27 04:00:00', '2022-03-27 05:00:00'],
              dtype='datetime64[ns]', freq='H')
[2]:
utc = pd.to_datetime(dt, utc=True)

utc
[2]:
DatetimeIndex(['2022-03-27 00:00:00+00:00', '2022-03-27 01:00:00+00:00',
               '2022-03-27 02:00:00+00:00', '2022-03-27 03:00:00+00:00',
               '2022-03-27 04:00:00+00:00', '2022-03-27 05:00:00+00:00'],
              dtype='datetime64[ns, UTC]', freq='H')

Hinweis

Der Typ des Ergebnisses dtype='datetime64[ns, UTC]' zeigt an, dass die Daten als UTC gespeichert sind.

Konvertieren wir diese Reihe in die Zeitzone Europe/Berlin:

[3]:
utc.tz_convert("Europe/Berlin")
[3]:
DatetimeIndex(['2022-03-27 01:00:00+01:00', '2022-03-27 03:00:00+02:00',
               '2022-03-27 04:00:00+02:00', '2022-03-27 05:00:00+02:00',
               '2022-03-27 06:00:00+02:00', '2022-03-27 07:00:00+02:00'],
              dtype='datetime64[ns, Europe/Berlin]', freq='H')

Umrechnung der Ortszeit in UTC#

[4]:
local = utc.tz_convert("Europe/Berlin")

local.tz_convert("UTC")
[4]:
DatetimeIndex(['2022-03-27 00:00:00+00:00', '2022-03-27 01:00:00+00:00',
               '2022-03-27 02:00:00+00:00', '2022-03-27 03:00:00+00:00',
               '2022-03-27 04:00:00+00:00', '2022-03-27 05:00:00+00:00'],
              dtype='datetime64[ns, UTC]', freq='H')

Umrechnung in Unixzeit#

Wenn ihr eine Series mit UTC- oder Ortszeitinformationen habt, könnt ihr mit diesem Code die Sekunden nach der Unixzeit ermitteln:

[5]:
uts = pd.to_datetime(dt).view(int) / 10**9

uts
[5]:
array([1.6483392e+09, 1.6483428e+09, 1.6483464e+09, 1.6483500e+09,
       1.6483536e+09, 1.6483572e+09])

Um die Unixzeit in UTC zu laden, könnt ihr wie folgt vorgehen:

[6]:
(pd.to_datetime(uts, unit='s').tz_localize("UTC"))
[6]:
DatetimeIndex(['2022-03-27 00:00:00+00:00', '2022-03-27 01:00:00+00:00',
               '2022-03-27 02:00:00+00:00', '2022-03-27 03:00:00+00:00',
               '2022-03-27 04:00:00+00:00', '2022-03-27 05:00:00+00:00'],
              dtype='datetime64[ns, UTC]', freq=None)

Manipulation von Terminen#

Umwandeln in Strings#

Mit pandas.DatetimeIndex habt ihr einige Möglichkeiten, Datum und Uhrzeit in Strings umzuwandeln, z.B. in den Namen des Wochentags:

[7]:
local.day_name(locale="de_DE.UTF-8")
[7]:
Index(['Sonntag', 'Sonntag', 'Sonntag', 'Sonntag', 'Sonntag', 'Sonntag'], dtype='object')

Welche locale bei euch zur Verfügung stehen, könnt ihr euch mit locale -a anzeigen lassen:

[8]:
!locale -a
en_NZ
nl_NL.UTF-8
pt_BR.UTF-8
fr_CH.ISO8859-15
eu_ES.ISO8859-15
en_US.US-ASCII
af_ZA
bg_BG
cs_CZ.UTF-8
fi_FI
zh_CN.UTF-8
eu_ES
sk_SK.ISO8859-2
nl_BE
fr_BE
sk_SK
en_US.UTF-8
en_NZ.ISO8859-1
de_CH
sk_SK.UTF-8
de_DE.UTF-8
am_ET.UTF-8
zh_HK
be_BY.UTF-8
uk_UA
pt_PT.ISO8859-1
en_AU.US-ASCII
kk_KZ.PT154
en_US
nl_BE.ISO8859-15
de_AT.ISO8859-1
hr_HR.ISO8859-2
fr_FR.ISO8859-1
af_ZA.UTF-8
am_ET
fi_FI.ISO8859-1
ro_RO.UTF-8
af_ZA.ISO8859-15
en_NZ.UTF-8
fi_FI.UTF-8
hr_HR.UTF-8
da_DK.UTF-8
ca_ES.ISO8859-1
en_AU.ISO8859-15
ro_RO.ISO8859-2
de_AT.UTF-8
pt_PT.ISO8859-15
sv_SE
fr_CA.ISO8859-1
fr_BE.ISO8859-1
en_US.ISO8859-15
it_CH.ISO8859-1
en_NZ.ISO8859-15
en_AU.UTF-8
de_AT.ISO8859-15
af_ZA.ISO8859-1
hu_HU.UTF-8
et_EE.UTF-8
he_IL.UTF-8
uk_UA.KOI8-U
be_BY
kk_KZ
hu_HU.ISO8859-2
it_CH
pt_BR
ko_KR
it_IT
fr_BE.UTF-8
ru_RU.ISO8859-5
zh_TW
zh_CN.GB2312
no_NO.ISO8859-15
de_DE.ISO8859-15
en_CA
fr_CH.UTF-8
sl_SI.UTF-8
uk_UA.ISO8859-5
pt_PT
hr_HR
cs_CZ
fr_CH
he_IL
zh_CN.GBK
zh_CN.GB18030
fr_CA
pl_PL.UTF-8
ja_JP.SJIS
sr_YU.ISO8859-5
be_BY.CP1251
sr_YU.ISO8859-2
sv_SE.UTF-8
sr_YU.UTF-8
de_CH.UTF-8
sl_SI
pt_PT.UTF-8
ro_RO
en_NZ.US-ASCII
ja_JP
zh_CN
fr_CH.ISO8859-1
ko_KR.eucKR
be_BY.ISO8859-5
nl_NL.ISO8859-15
en_GB.ISO8859-1
en_CA.US-ASCII
is_IS.ISO8859-1
ru_RU.CP866
nl_NL
fr_CA.ISO8859-15
sv_SE.ISO8859-15
hy_AM
en_CA.ISO8859-15
en_US.ISO8859-1
zh_TW.Big5
ca_ES.UTF-8
ru_RU.CP1251
en_GB.UTF-8
en_GB.US-ASCII
ru_RU.UTF-8
eu_ES.UTF-8
es_ES.ISO8859-1
hu_HU
el_GR.ISO8859-7
en_AU
it_CH.UTF-8
en_GB
sl_SI.ISO8859-2
ru_RU.KOI8-R
nl_BE.UTF-8
et_EE
fr_FR.ISO8859-15
cs_CZ.ISO8859-2
lt_LT.UTF-8
pl_PL.ISO8859-2
fr_BE.ISO8859-15
is_IS.UTF-8
tr_TR.ISO8859-9
da_DK.ISO8859-1
lt_LT.ISO8859-4
lt_LT.ISO8859-13
zh_TW.UTF-8
bg_BG.CP1251
el_GR.UTF-8
be_BY.CP1131
da_DK.ISO8859-15
is_IS.ISO8859-15
no_NO.ISO8859-1
nl_NL.ISO8859-1
nl_BE.ISO8859-1
sv_SE.ISO8859-1
pt_BR.ISO8859-1
zh_CN.eucCN
it_IT.UTF-8
en_CA.UTF-8
uk_UA.UTF-8
de_CH.ISO8859-15
de_DE.ISO8859-1
ca_ES
sr_YU
hy_AM.ARMSCII-8
ru_RU
zh_HK.UTF-8
eu_ES.ISO8859-1
is_IS
bg_BG.UTF-8
ja_JP.UTF-8
it_CH.ISO8859-15
fr_FR.UTF-8
ko_KR.UTF-8
et_EE.ISO8859-15
kk_KZ.UTF-8
ca_ES.ISO8859-15
en_IE.UTF-8
es_ES
de_CH.ISO8859-1
en_CA.ISO8859-1
es_ES.ISO8859-15
en_AU.ISO8859-1
el_GR
da_DK
no_NO
it_IT.ISO8859-1
en_IE
zh_HK.Big5HKSCS
hi_IN.ISCII-DEV
ja_JP.eucJP
it_IT.ISO8859-15
pl_PL
ko_KR.CP949
fr_CA.UTF-8
fi_FI.ISO8859-15
en_GB.ISO8859-15
fr_FR
hy_AM.UTF-8
no_NO.UTF-8
es_ES.UTF-8
de_AT
tr_TR.UTF-8
de_DE
lt_LT
tr_TR
C
POSIX

Weitere Attribute von DatetimeIndex, mit denen sich Datum und Zeit in Strings umwandeln lassen, sind:

Attribut

Beschreibung

year

das Jahr der datetime

month

der Monat als Januar 1 und Dezember 12

day

der Tag der datetime

hour

die Stunden der datetime

minute

die Minuten der datetime

second

die Sekunden der datetime

microsecond

die Mikrosekunden der datetime

nanosecond

die Nanosekunden von datetime

date

gibt ein Numpy-Array von Python datetime.date-Objekten zurück

time

gibt ein NumPy-Array von datetime.time-Objekten zurück

timetz

liefert ein numpy-Array von datetime.time-Objekten mit Zeitzoneninformationen

dayofyear, day_of_year

der ordinale Tag des Jahres

dayofweek

der Tag der Woche mit Montag (0) und Sonntag (6)

day_of_week

der Tag der Woche mit Montag (0) und Sonntag (6)

weekday

der Tag der Woche mit Montag (0) und Sonntag (6)

quarter

gibt das Jahresquartal zurück

tz

gibt die Zeitzone zurück

freq

gibt das Frequenzobjekt zurück, wenn es gesetzt ist, andernfalls None

freqstr

gibt das Frequenz-Objekt als String zurück, wenn es gesetzt ist, andernfalls None

is_month_start

zeigt an, ob das Datum der erste Tag des Monats ist

is_month_end

zeigt an, ob das Datum der letzte Tag des Monats ist

is_quarter_start

zeigt an, ob das Datum der erste Tag eines Quartals ist

is_quarter_end

zeigt an, ob das Datum der letzte Tag eines Quartals ist

is_year_start

zeigt an, ob das Datum der erste Tag eines Jahres ist

is_year_end

zeigt an, ob das Datum der letzte Tag eines Jahres ist

is_leap_year

Boolescher Indikator, ob das Datum in ein Schaltjahr fällt

inferred_freq

versucht, eine Zeichenkette zurückzugeben, die eine durch infer_freq ermittelte Frequenz darstellt

Es gibt jedoch auch einige Methoden, mit denen ihr den DatetimeIndex in Stringsumwandeln könnt, z.B. strftime:

[9]:
local.strftime("%d.%m.%Y")
[9]:
Index(['27.03.2022', '27.03.2022', '27.03.2022', '27.03.2022', '27.03.2022',
       '27.03.2022'],
      dtype='object')

Hinweis

In strftime() and strptime() Format Codes erhaltet ihr eine Übersicht über die verschiedenen Formattierungsmöglichkeiten von strftime.

Weitere Methoden sind:

Methode

Beschreibung

normalize

konvertiert Zeiten in Mitternacht

strftime

konvertiert in Index unter Verwendung des angegebenen Datumsformats

snap

rastet den Zeitstempel auf der nächsten auftretenden Frequenz ein

tz_convert

konvertiert ein tz-fähiges Datetime-Array/Index von einer Zeitzone in eine andere

tz_localize

Lokalisiert tz-naives Datetime Array/Index in tz-kompatibles Datetime Array/Index

round

rundet die Daten zur nächsten angegebenen Frequenz

floor

rundet die Daten ab auf die angegebene Frequenz

ceil

rundet die Daten auf auf die angegebene Frequenz

to_period

wandelt die Daten um in einen PeriodArray/Index bei einer bestimmten Frequenz

to_perioddelta

Berechnet TimedeltaArray der Differenz zwischen den Indexwerten und dem in PeriodArray umgewandelten Index bei der angegebenen Frequenz

to_pydatetime

gibt Datetime Array/Index als ndarray-Objekt von datetime.datetime-Objekten zurück

to_series

erzeugt eine Series mit Index und Werten, die den Indexschlüsseln entsprechen; nützlich mit map für die Rückgabe eines Indexers

to_frame

erzeugt einen DataFrame mit einer Spalte, die den Index enthält

month_name

gibt die Monatsnamen des DateTimeIndex mit dem angegebenen locale zurück

day_name

gibt die Tagesnamen des DateTimeIndex mit dem angegebenen locale zurück

mean

gibt den Mittelwert des Arrays zurück

std

gibt die Standardabweichung der Stichprobe über die angeforderte Achse zurück