{ "cells": [ { "cell_type": "markdown", "id": "3ab0e5f6", "metadata": {}, "source": [ "# Datum und Uhrzeit\n", "\n", "Mit pandas könnt ihr `Series` mit Datums- und Zeitinformationen erstellen. Im folgenden werden wir häufige Operationen mit Datumsdaten zeigen.\n", "\n", "
\n", "\n", "**Hinweis:**\n", "\n", "pandas unterstützt Datumsangaben, die in [UTC](https://de.wikipedia.org/wiki/Koordinierte_Weltzeit)-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](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Timestamp.html)-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.\n", "
\n", "
\n", "\n", "**Siehe auch:**\n", "\n", "* [Time series / date functionality](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html)\n", "
" ] }, { "cell_type": "markdown", "id": "5779baed", "metadata": {}, "source": [ "## Laden von UTC-Zeitdaten" ] }, { "cell_type": "code", "execution_count": 1, "id": "f0e9c669", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2022-03-27 00:00:00', '2022-03-27 01:00:00',\n", " '2022-03-27 02:00:00', '2022-03-27 03:00:00',\n", " '2022-03-27 04:00:00', '2022-03-27 05:00:00'],\n", " dtype='datetime64[ns]', freq='H')" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "\n", "dt = pd.date_range(\"2022-03-27\", periods=6, freq=\"H\")\n", "\n", "dt" ] }, { "cell_type": "code", "execution_count": 2, "id": "6c2b24e3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2022-03-27 00:00:00+00:00', '2022-03-27 01:00:00+00:00',\n", " '2022-03-27 02:00:00+00:00', '2022-03-27 03:00:00+00:00',\n", " '2022-03-27 04:00:00+00:00', '2022-03-27 05:00:00+00:00'],\n", " dtype='datetime64[ns, UTC]', freq='H')" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "utc = pd.to_datetime(dt, utc=True)\n", "\n", "utc" ] }, { "cell_type": "markdown", "id": "9d6ca423", "metadata": {}, "source": [ "
\n", "\n", "**Hinweis:**\n", "\n", "Der Typ des Ergebnisses `dtype='datetime64[ns, UTC]'` zeigt an, dass die Daten als UTC gespeichert sind.\n", "
" ] }, { "cell_type": "markdown", "id": "237ebe23", "metadata": {}, "source": [ "Konvertieren wir diese Reihe in die Zeitzone Europe/Berlin:" ] }, { "cell_type": "code", "execution_count": 3, "id": "6987cfdb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2022-03-27 01:00:00+01:00', '2022-03-27 03:00:00+02:00',\n", " '2022-03-27 04:00:00+02:00', '2022-03-27 05:00:00+02:00',\n", " '2022-03-27 06:00:00+02:00', '2022-03-27 07:00:00+02:00'],\n", " dtype='datetime64[ns, Europe/Berlin]', freq='H')" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "utc.tz_convert(\"Europe/Berlin\")" ] }, { "cell_type": "markdown", "id": "8582dc06", "metadata": {}, "source": [ "## Umrechnung der Ortszeit in UTC" ] }, { "cell_type": "code", "execution_count": 4, "id": "02158d3b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2022-03-27 00:00:00+00:00', '2022-03-27 01:00:00+00:00',\n", " '2022-03-27 02:00:00+00:00', '2022-03-27 03:00:00+00:00',\n", " '2022-03-27 04:00:00+00:00', '2022-03-27 05:00:00+00:00'],\n", " dtype='datetime64[ns, UTC]', freq='H')" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "local = utc.tz_convert(\"Europe/Berlin\")\n", "\n", "local.tz_convert(\"UTC\")" ] }, { "cell_type": "markdown", "id": "8e13459d", "metadata": {}, "source": [ "## Umrechnung in Unixzeit\n", "\n", "Wenn ihr eine `Series` mit UTC- oder Ortszeitinformationen habt, könnt ihr mit diesem Code die Sekunden nach der Unixzeit ermitteln:" ] }, { "cell_type": "code", "execution_count": 5, "id": "3906bca6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1.6483392e+09, 1.6483428e+09, 1.6483464e+09, 1.6483500e+09,\n", " 1.6483536e+09, 1.6483572e+09])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "uts = pd.to_datetime(dt).view(int) / 10**9\n", "\n", "uts" ] }, { "cell_type": "markdown", "id": "284561d2", "metadata": {}, "source": [ "Um die Unixzeit in UTC zu laden, könnt ihr wie folgt vorgehen:" ] }, { "cell_type": "code", "execution_count": 6, "id": "15dda2ea", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2022-03-27 00:00:00+00:00', '2022-03-27 01:00:00+00:00',\n", " '2022-03-27 02:00:00+00:00', '2022-03-27 03:00:00+00:00',\n", " '2022-03-27 04:00:00+00:00', '2022-03-27 05:00:00+00:00'],\n", " dtype='datetime64[ns, UTC]', freq=None)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(pd.to_datetime(uts, unit='s').tz_localize(\"UTC\"))" ] }, { "cell_type": "markdown", "id": "edb0b9c2", "metadata": {}, "source": [ "## Manipulation von Terminen" ] }, { "cell_type": "markdown", "id": "0995b155", "metadata": {}, "source": [ "### Umwandeln in Strings" ] }, { "cell_type": "markdown", "id": "6ed2ebdc", "metadata": {}, "source": [ "Mit [pandas.DatetimeIndex](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DatetimeIndex.html) habt ihr einige Möglichkeiten, Datum und Uhrzeit in Strings umzuwandeln, z.B. in den Namen des Wochentags:" ] }, { "cell_type": "code", "execution_count": 7, "id": "e46bc643", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Sonntag', 'Sonntag', 'Sonntag', 'Sonntag', 'Sonntag', 'Sonntag'], dtype='object')" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "local.day_name(locale=\"de_DE.UTF-8\")" ] }, { "cell_type": "markdown", "id": "39cdac2f", "metadata": {}, "source": [ "Welche `locale` bei euch zur Verfügung stehen, könnt ihr euch mit `locale -a` anzeigen lassen:" ] }, { "cell_type": "code", "execution_count": 8, "id": "1b93f104", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "en_NZ\n", "nl_NL.UTF-8\n", "pt_BR.UTF-8\n", "fr_CH.ISO8859-15\n", "eu_ES.ISO8859-15\n", "en_US.US-ASCII\n", "af_ZA\n", "bg_BG\n", "cs_CZ.UTF-8\n", "fi_FI\n", "zh_CN.UTF-8\n", "eu_ES\n", "sk_SK.ISO8859-2\n", "nl_BE\n", "fr_BE\n", "sk_SK\n", "en_US.UTF-8\n", "en_NZ.ISO8859-1\n", "de_CH\n", "sk_SK.UTF-8\n", "de_DE.UTF-8\n", "am_ET.UTF-8\n", "zh_HK\n", "be_BY.UTF-8\n", "uk_UA\n", "pt_PT.ISO8859-1\n", "en_AU.US-ASCII\n", "kk_KZ.PT154\n", "en_US\n", "nl_BE.ISO8859-15\n", "de_AT.ISO8859-1\n", "hr_HR.ISO8859-2\n", "fr_FR.ISO8859-1\n", "af_ZA.UTF-8\n", "am_ET\n", "fi_FI.ISO8859-1\n", "ro_RO.UTF-8\n", "af_ZA.ISO8859-15\n", "en_NZ.UTF-8\n", "fi_FI.UTF-8\n", "hr_HR.UTF-8\n", "da_DK.UTF-8\n", "ca_ES.ISO8859-1\n", "en_AU.ISO8859-15\n", "ro_RO.ISO8859-2\n", "de_AT.UTF-8\n", "pt_PT.ISO8859-15\n", "sv_SE\n", "fr_CA.ISO8859-1\n", "fr_BE.ISO8859-1\n", "en_US.ISO8859-15\n", "it_CH.ISO8859-1\n", "en_NZ.ISO8859-15\n", "en_AU.UTF-8\n", "de_AT.ISO8859-15\n", "af_ZA.ISO8859-1\n", "hu_HU.UTF-8\n", "et_EE.UTF-8\n", "he_IL.UTF-8\n", "uk_UA.KOI8-U\n", "be_BY\n", "kk_KZ\n", "hu_HU.ISO8859-2\n", "it_CH\n", "pt_BR\n", "ko_KR\n", "it_IT\n", "fr_BE.UTF-8\n", "ru_RU.ISO8859-5\n", "zh_TW\n", "zh_CN.GB2312\n", "no_NO.ISO8859-15\n", "de_DE.ISO8859-15\n", "en_CA\n", "fr_CH.UTF-8\n", "sl_SI.UTF-8\n", "uk_UA.ISO8859-5\n", "pt_PT\n", "hr_HR\n", "cs_CZ\n", "fr_CH\n", "he_IL\n", "zh_CN.GBK\n", "zh_CN.GB18030\n", "fr_CA\n", "pl_PL.UTF-8\n", "ja_JP.SJIS\n", "sr_YU.ISO8859-5\n", "be_BY.CP1251\n", "sr_YU.ISO8859-2\n", "sv_SE.UTF-8\n", "sr_YU.UTF-8\n", "de_CH.UTF-8\n", "sl_SI\n", "pt_PT.UTF-8\n", "ro_RO\n", "en_NZ.US-ASCII\n", "ja_JP\n", "zh_CN\n", "fr_CH.ISO8859-1\n", "ko_KR.eucKR\n", "be_BY.ISO8859-5\n", "nl_NL.ISO8859-15\n", "en_GB.ISO8859-1\n", "en_CA.US-ASCII\n", "is_IS.ISO8859-1\n", "ru_RU.CP866\n", "nl_NL\n", "fr_CA.ISO8859-15\n", "sv_SE.ISO8859-15\n", "hy_AM\n", "en_CA.ISO8859-15\n", "en_US.ISO8859-1\n", "zh_TW.Big5\n", "ca_ES.UTF-8\n", "ru_RU.CP1251\n", "en_GB.UTF-8\n", "en_GB.US-ASCII\n", "ru_RU.UTF-8\n", "eu_ES.UTF-8\n", "es_ES.ISO8859-1\n", "hu_HU\n", "el_GR.ISO8859-7\n", "en_AU\n", "it_CH.UTF-8\n", "en_GB\n", "sl_SI.ISO8859-2\n", "ru_RU.KOI8-R\n", "nl_BE.UTF-8\n", "et_EE\n", "fr_FR.ISO8859-15\n", "cs_CZ.ISO8859-2\n", "lt_LT.UTF-8\n", "pl_PL.ISO8859-2\n", "fr_BE.ISO8859-15\n", "is_IS.UTF-8\n", "tr_TR.ISO8859-9\n", "da_DK.ISO8859-1\n", "lt_LT.ISO8859-4\n", "lt_LT.ISO8859-13\n", "zh_TW.UTF-8\n", "bg_BG.CP1251\n", "el_GR.UTF-8\n", "be_BY.CP1131\n", "da_DK.ISO8859-15\n", "is_IS.ISO8859-15\n", "no_NO.ISO8859-1\n", "nl_NL.ISO8859-1\n", "nl_BE.ISO8859-1\n", "sv_SE.ISO8859-1\n", "pt_BR.ISO8859-1\n", "zh_CN.eucCN\n", "it_IT.UTF-8\n", "en_CA.UTF-8\n", "uk_UA.UTF-8\n", "de_CH.ISO8859-15\n", "de_DE.ISO8859-1\n", "ca_ES\n", "sr_YU\n", "hy_AM.ARMSCII-8\n", "ru_RU\n", "zh_HK.UTF-8\n", "eu_ES.ISO8859-1\n", "is_IS\n", "bg_BG.UTF-8\n", "ja_JP.UTF-8\n", "it_CH.ISO8859-15\n", "fr_FR.UTF-8\n", "ko_KR.UTF-8\n", "et_EE.ISO8859-15\n", "kk_KZ.UTF-8\n", "ca_ES.ISO8859-15\n", "en_IE.UTF-8\n", "es_ES\n", "de_CH.ISO8859-1\n", "en_CA.ISO8859-1\n", "es_ES.ISO8859-15\n", "en_AU.ISO8859-1\n", "el_GR\n", "da_DK\n", "no_NO\n", "it_IT.ISO8859-1\n", "en_IE\n", "zh_HK.Big5HKSCS\n", "hi_IN.ISCII-DEV\n", "ja_JP.eucJP\n", "it_IT.ISO8859-15\n", "pl_PL\n", "ko_KR.CP949\n", "fr_CA.UTF-8\n", "fi_FI.ISO8859-15\n", "en_GB.ISO8859-15\n", "fr_FR\n", "hy_AM.UTF-8\n", "no_NO.UTF-8\n", "es_ES.UTF-8\n", "de_AT\n", "tr_TR.UTF-8\n", "de_DE\n", "lt_LT\n", "tr_TR\n", "C\n", "POSIX\n" ] } ], "source": [ "!locale -a" ] }, { "cell_type": "markdown", "id": "e897752e", "metadata": {}, "source": [ "Weitere Attribute von `DatetimeIndex`, mit denen sich Datum und Zeit in Strings umwandeln lassen, sind:\n", "\n", "Attribut | Beschreibung\n", ":------- | :-----------\n", "`year` | das Jahr der `datetime`\n", "`month` | der Monat als Januar `1` und Dezember `12`\n", "`day` | der Tag der `datetime`\n", "`hour` | die Stunden der `datetime`\n", "`minute` | die Minuten der `datetime`\n", "`second` | die Sekunden der `datetime`\n", "`microsecond` | die Mikrosekunden der `datetime`\n", "`nanosecond` | die Nanosekunden von `datetime`\n", "`date` | gibt ein Numpy-Array von Python `datetime.date`-Objekten zurück\n", "`time` | gibt ein NumPy-Array von `datetime.time`-Objekten zurück\n", "`timetz` | liefert ein numpy-Array von `datetime.time`-Objekten mit Zeitzoneninformationen\n", "`dayofyear`, `day_of_year` | der ordinale Tag des Jahres\n", "`dayofweek` | der Tag der Woche mit Montag (`0`) und Sonntag (`6`)\n", "`day_of_week` | der Tag der Woche mit Montag (`0`) und Sonntag (`6`)\n", "`weekday` | der Tag der Woche mit Montag (`0`) und Sonntag (`6`)\n", "`quarter` | gibt das Jahresquartal zurück\n", "`tz` | gibt die Zeitzone zurück\n", "`freq` | gibt das Frequenzobjekt zurück, wenn es gesetzt ist, andernfalls `None`\n", "`freqstr` | gibt das Frequenz-Objekt als String zurück, wenn es gesetzt ist, andernfalls `None`\n", "`is_month_start` | zeigt an, ob das Datum der erste Tag des Monats ist\n", "`is_month_end` | zeigt an, ob das Datum der letzte Tag des Monats ist\n", "`is_quarter_start` | zeigt an, ob das Datum der erste Tag eines Quartals ist\n", "`is_quarter_end` | zeigt an, ob das Datum der letzte Tag eines Quartals ist\n", "`is_year_start` | zeigt an, ob das Datum der erste Tag eines Jahres ist\n", "`is_year_end` | zeigt an, ob das Datum der letzte Tag eines Jahres ist\n", "`is_leap_year` | Boolescher Indikator, ob das Datum in ein Schaltjahr fällt\n", "`inferred_freq` | versucht, eine Zeichenkette zurückzugeben, die eine durch `infer_freq` ermittelte Frequenz darstellt" ] }, { "cell_type": "markdown", "id": "bcdb4333", "metadata": {}, "source": [ "Es gibt jedoch auch einige Methoden, mit denen ihr den `DatetimeIndex` in Stringsumwandeln könnt, z.B. `strftime`:" ] }, { "cell_type": "code", "execution_count": 9, "id": "1ec8dd26", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['27.03.2022', '27.03.2022', '27.03.2022', '27.03.2022', '27.03.2022',\n", " '27.03.2022'],\n", " dtype='object')" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "local.strftime(\"%d.%m.%Y\")" ] }, { "cell_type": "markdown", "id": "5f95f9d8", "metadata": {}, "source": [ "
\n", "\n", "**Hinweis:**\n", "\n", "In [strftime() and strptime() Format Codes](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes) erhaltet ihr eine Übersicht über die verschiedenen Formattierungsmöglichkeiten von `strftime`.\n", "
\n", "\n", "Weitere Methoden sind:\n", "\n", "Methode | Beschreibung\n", ":------ | :-----------\n", "`normalize` | konvertiert Zeiten in Mitternacht\n", "`strftime` | konvertiert in Index unter Verwendung des angegebenen Datumsformats\n", "`snap` | rastet den Zeitstempel auf der nächsten auftretenden Frequenz ein\n", "`tz_convert` | konvertiert ein `tz`-fähiges Datetime-Array/Index von einer Zeitzone in eine andere\n", "`tz_localize` | Lokalisiert `tz`-naives Datetime Array/Index in `tz`-kompatibles Datetime Array/Index\n", "`round` | rundet die Daten zur nächsten angegebenen Frequenz\n", "`floor` | rundet die Daten ab auf die angegebene Frequenz\n", "`ceil` | rundet die Daten auf auf die angegebene Frequenz\n", "`to_period` | wandelt die Daten um in einen PeriodArray/Index bei einer bestimmten Frequenz\n", "`to_perioddelta` | Berechnet `TimedeltaArray` der Differenz zwischen den Indexwerten und dem in `PeriodArray` umgewandelten Index bei der angegebenen Frequenz\n", "`to_pydatetime` | gibt `Datetime` Array/Index als `ndarray`-Objekt von `datetime.datetime`-Objekten zurück\n", "`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\n", "`to_frame` | erzeugt einen `DataFrame` mit einer Spalte, die den Index enthält\n", "`month_name` | gibt die Monatsnamen des `DateTimeIndex` mit dem angegebenen `locale` zurück\n", "`day_name` | gibt die Tagesnamen des `DateTimeIndex` mit dem angegebenen `locale` zurück\n", "`mean` | gibt den Mittelwert des Arrays zurück\n", "`std` | gibt die Standardabweichung der Stichprobe über die angeforderte Achse zurück" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.11 Kernel", "language": "python", "name": "python311" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.10" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }