[PYTHON] Behandelt verschiedene Datumsformate mit Pandas

Da es sich um eine neue Lebenserhaltungsphase handelt, möchte ich diskutieren, wie "Pandas" verwendet werden, insbesondere das Datumsformat. Es gibt den Ruf, dass "Python stark in der Datenanalyse ist", aber dies wird durch die folgenden "Standard" -Pakete realisiert.

  • "pandas" for representing and analyzing data
  • "NumPy" for basic numeriacal computation
  • "SciPy" for scientific computation including statistics
  • "StatsModels" for regression and other statistical analysis
  • "matplotlib" for visualization (Das Obige wird aus "Think Stats" zitiert.)

pandas ist ein Paket zur Bearbeitung von Serienobjekten (eindimensionale Datenstruktur) und DataFrame-Objekten (zweidimensionale Datenstruktur) und unterstützt ursprünglich die Funktionen, die für den Umgang mit Wirtschaftsdaten wie Aktienkursen erforderlich sind. Man kann sagen, dass es sich um eine Bibliothek handelt, die stark gegen sogenannte Zeitreihendaten ist.

Betrachtet man jedoch die tatsächlich auf dem Markt befindlichen Zeitreihendaten, so gibt es Fälle, in denen "2016-03-28" im Standardformat in die Datumsspalte eingegeben wird, in einigen Fällen jedoch "28-Mar-16". In einigen Fällen ist es schwierig zu handhaben. In diesem Artikel möchte ich bestätigen, wie mit verschiedenen Daten umgegangen wird.

(Die Programmierumgebung ist Python 2.7.11 + Jupyter + IPython-Kernel und Python 3.5.1 + Jupyter + IPython-Kernel, Pandas 0.18.0.)

Konvertieren Sie Daten, wenn Sie so viele Daten wie möglich eingeben

Hierbei wird angenommen, dass die Zeitreihendaten als CSV-Datei (Comma Separated Values) gelesen werden. Bei der Analyse von Zeitreihendaten denke ich, dass Uhrzeit und Datum als Index für die Datenstruktur verwendet werden. In Pandas wird read_csv () wie folgt verwendet.

Wenn Sie die folgende CSV-Datei eingeben möchten

Date,Open,High,Low,Close
2014/12/31,17702.11914,17713.75977,17450.76953,17450.76953
2014/12/30,17702.11914,17713.75977,17450.76953,17450.76953
2014/12/29,17914.55078,17914.55078,17525.66016,17729.83984
2014/12/26,17778.91016,17843.73047,17769.00977,17818.96094
 . . . 
(Weggelassen)

Mit dem folgenden Code:

df1 = pd.read_csv('./pandas_date_ex/example1.csv', index_col='Date', parse_dates='Date')
df1.head()         # for check

Die in df1 eingegebenen Inhalte lauten wie folgt. pandas_date_index1.PNG

Der hier zu bestätigende Punkt ist, dass das "Datum" ganz links ein Zeitstempeltyp sein muss, um Datum als numerischen Wert zu behandeln, nicht als Zeichenfolgentyp. (Im Verlauf der Analyse möchte ich den Index "Zeichenkette" nicht verwenden, wenn ich eine Interpolations- und Regressionsanalyse durchführe.)

>>> type(df1.index[0])
pandas.tslib.Timestamp

Sie können sehen, dass das Datum wie oben gezeigt ordnungsgemäß in den Pandas.Timestamp-Typ konvertiert wurde. Dies liegt daran, dass die folgenden in read_csv () angegebenen Optionen ordnungsgemäß funktionierten.

--index_col = 'Datum': Verwenden Sie die Spalte 'Datum' als Index des DataFrame. --parse_dates = 'Datum': Scannen Sie die Spalte 'Datum' und konvertieren Sie sie in Datetime.

Wie oben erwähnt, hat das Standard-Datumsdatenformat (z. B. 31.12.2014) gut funktioniert.

Situation des Datumsformats, die etwas schwierig erscheint

Behandeln Sie als Nächstes das folgende "example2.csv". Um den Inhalt zu überprüfen, geben Sie zunächst die Datei ohne Optionen ein.

df20 = pd.read_csv('./pandas_date_ex/example2.csv')
df20.head()

pandas_date_index2.PNG

Zu diesem Zeitpunkt ist 'Datum' nicht indiziert und der Variablentyp bleibt Zeichenfolge (str). Wie Sie sehen können, scheint es diesmal ein wenig schwierig zu sein, wie '15 -Mar-16 'zu entziffern. Es gibt verschiedene Datumsformate auf der Welt, einschließlich dieses Beispiels. Daher scheint es notwendig zu sein, zu überlegen, wie mit ihnen umgegangen werden soll.

Verschiedene Fälle von Datumsnotation

Versuchen wir nun die in "example1.csv" verwendete Methode, die früher in "example2.csv" verwendet wurde. Ich werde die Art und Weise des Hinzufügens von Optionen ein wenig ändern, aber dies ändert nur die Spaltenspezifikation vom Spaltennamen ('Datum') zur Spaltennummer (= 0).

df2 = pd.read_csv('./pandas_date_ex/example2.csv', index_col=0, parse_dates=0)
df2.head()

pandas_date_index3.PNG

Ich fand es schwierig, das Datum zu interpretieren, aber es funktionierte unerwartet. Der von pandas.read_csv () verwendete Datumsparser sieht ziemlich gut aus.

Eigentlich habe ich den folgenden Code in Erwartung des Falls vorbereitet, in dem die Datumskonvertierung nicht funktioniert. (... Erstellt unter Bezugnahme auf die Q & A-Site / den Stackoverflow.)

f2 = '%d-%b-%y'
my_parser = lambda date: pd.datetime.strptime(date, f2)
df21 = pd.read_csv('example2.csv', index_col=0, parse_dates=0, 
                    date_parser=my_parser)

Sie können Ihren eigenen Parser vorbereiten und read_csv () verwenden, um ihn zu verwenden. Diesmal funktionierte die oben beschriebene Methode, sodass dieser Code nicht ins Spiel kam.

Was ist das Datumsformat einschließlich Japanisch?

Ich glaube nicht, dass es viele gibt, aber ich würde gerne etwas über Datumsformate einschließlich Japanisch erfahren. Versuchen Sie die gleiche Methode wie zuvor.

df31 = pd.read_csv('./pandas_date_ex/example3.csv', index_col='Date', parse_dates='Date')
df31.head()

pandas_date_index4.PNG

Es scheint indiziert zu sein, aber Japanisch ist in der Spalte Datum enthalten.

>>> type(df31.index[0])
str

Auch hier blieb die Spalte 'Datum' ein Zeichenfolgentyp. Mit anderen Worten, die in read_csv () angegebene Option parse_dates funktioniert nicht. (Es scheint, dass es keine Spezifikation ist, die eine Ausnahme verursacht und die Arbeit unterbricht.)

In diesem Fall benötigen Sie noch einen eigenen Parser.

f3 = '%Y Jahr%m Monat%d Tag'
my_parser = lambda date: pd.datetime.strptime(date, f3)
df3 = pd.read_csv('./pandas_date_ex/example3.csv', index_col=0, parse_dates=0, 
                    date_parser=my_parser)
df3.head()

pandas_date_index5.PNG

Es ging gut. Lassen Sie uns abschließend (einen Teil) dieser Daten zeichnen.

df3[['High', 'Low']].plot(figsize=(8,4), grid=True)

pandas_date_index6.png

Es scheint kein Problem zu geben. (Die Plot-Funktion von Pandas ist ein Wrapper der Matplotlib-Bibliothek, sieht also wie in der obigen Abbildung aus.)

Wie oben erwähnt, scheint der Datumsparser in read_csv () von Pandas in der Lage zu sein, einen ziemlich großen Bereich zu verarbeiten. Wir haben auch festgestellt, dass Sonderfälle wie Daten wie Japanisch wie "Jahr" und "Monat" durch die Erstellung eines eigenen Parsers behandelt werden können. (Als Anwendung sollte es möglich sein, das Jahr mit dem japanischen Yuan durch Schreiben eines Parsers in den westlichen Kalender umzuwandeln.)

Zusätzlich ist es notwendig, das Leseformat im eigenen Parser anzugeben, aber es wird gesagt, dass dies der Angabe von strftime () in C-Sprache entspricht. (Referenz: https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior)

Weitere Informationen finden Sie im Dokument. Ich werde das Datumsformat extrahieren, das Sie wahrscheinlich verwenden werden. (Die Rolle der Richtlinie ändert sich je nach Fall.)

Richtlinie Bedeutung Beispiel
%d 0 füllen(zero padding)Das Datum im Monat in Dezimalzahl. 01, 02, ..., 31
%b Der Monatsname des Gebietsschemas wird in Kurzform angezeigt. Jan, Feb, ..., Dec (en_US); Jan, Feb, ..., Dez (de_DE)
%B Zeigt den Monatsnamen des Gebietsschemas an. January, February, ...,
%m Monat in Dezimalschreibweise gefüllt mit 0. 01, 02, ..., 12
%y Jahr mit einem Jahrhundert (2 Ziffern), ausgedrückt in 0-gefüllten Dezimalzahlen. 00, 01, ..., 99
%Y ANZEIGE(4 Ziffern)Repräsentiert die Dezimalschreibweise von. 2011, 2012, 2013, ...

Ich bin auf ein kleines Detail eingegangen, aber Pandas sind sehr vielseitig und werden an vielen Orten verwendet, nicht nur in Zeitreihendaten. Ich denke, dass der Arbeitsablauf der Vorverarbeitung von Daten mithilfe von Pandas und der Eingabe der formatierten Daten in das Framework für maschinelles Lernen und Deep Learning ebenfalls üblich ist.

(Hinweis zum Verständnis datumsbezogener Klassen)

Im Folgenden sind einige der häufigsten datumsbezogenen Klassen aufgeführt, die von Python verarbeitet werden. Klasse --datetime.datetime Klasse --numpy.datetime64 --pandas.Timestamp Klasse

Mit meinem schlechten Verständnis schrieb ich diesen Artikel unter der Annahme, dass diese drei Klassen (insbesondere datetime.datetime und pandas.Timestamp) fast gleich sind. Aber genau genommen sind sie möglicherweise nicht gleich. (Ich denke nicht, dass dies das Verhalten des im Artikel veröffentlichten Codes beeinflusst, aber wenn es Fehler oder ungenaue Beschreibungen gibt, möchte ich den Artikel korrigieren. Wenn Sie Vorschläge haben, bitte.)

Referenzen (Website)

Recommended Posts

Behandelt verschiedene Datumsformate mit Pandas
Behandeln Sie Ganzzahltypen mit fehlenden Werten in Pandas
Mit Pandas schnell visualisieren
Datensätze mit Pandas verarbeiten (1)
Bootstrap-Sampling mit Pandas
Konvertieren Sie 202003 bis 2020-03 mit Pandas
Zusammenführen von Datensätzen mit Pandas
Pandas lernen mit Chemoinfomatik
Behandle Excel mit Python
Behandle Rabbimq mit Python
Datenvisualisierung mit Pandas
Datenmanipulation mit Pandas!
Daten mit Pandas mischen
Holen Sie sich ein Date mit Python
Verschiedene Farbleisten mit Matplotlib
Einfallsreichtum beim speichersparenden Umgang mit Daten mit Pandas
Lesen Sie CSV mit Python-Pandas
Laden Sie verschachtelten Json mit Pandas
Probieren Sie verschiedene Dinge mit PhantomJS aus
[Python] Ändere den Typ mit Pandas
[Tipps] Behandle Athena mit Python
Einzeilige Ergänzung mit verschiedenen Skripten
Bearbeiten Sie verschiedene Datenbanken mit Python
Standardisieren Sie nach Gruppen mit Pandas
Behandle numpy Arrays mit f2py
Entwickelt mit Choregraphe und verschiedenen Memoranden
Arbeiten mit JSON-Dateien in Matlab
Verhindern Sie Auslassungen mit Pandas Print
Datenverarbeitungstipps mit Pandas