Ich habe einen Datenrahmen, df, mit der folgenden Spalte:
df['ArrivalDate'] =
...
936 2012-12-31
938 2012-12-29
965 2012-12-31
966 2012-12-31
967 2012-12-31
968 2012-12-31
969 2012-12-31
970 2012-12-29
971 2012-12-31
972 2012-12-29
973 2012-12-29
...
Die Elemente der Spalte sind pandas.tslib.Timestamp.
Ich möchte nur das Jahr und den Monat angeben. Ich dachte, es gäbe einen einfachen Weg, aber ich kann es nicht herausfinden.
Folgendes habe ich versucht:
df['ArrivalDate'].resample('M', how = 'mean')
Ich habe folgenden Fehler erhalten:
Only valid with DatetimeIndex or PeriodIndex
Dann habe ich versucht:
df['ArrivalDate'].apply(lambda(x):x[:-2])
Ich habe folgenden Fehler erhalten:
'Timestamp' object has no attribute '__getitem__'
Irgendwelche Vorschläge?
Edit: Ich habe es irgendwie herausgefunden.
df.index = df['ArrivalDate']
Dann kann ich mithilfe des Index eine weitere Spalte neu abtasten.
Aber ich möchte immer noch eine Methode zum Neukonfigurieren der gesamten Spalte. Irgendwelche Ideen?
to_period
:df.date_column.dt.month
(oder.year
, oder.day
) arbeitet.dt.month
verliert das Jahr. Und.dt.to_period('M')
ändert den Datentyp in etwas, das kein datetime64 mehr ist. Ich landete mit bis Juan Antwort darauf hindeutet ,.astype('datetime64[M]')
um die Werte zu kürzen.Antworten:
Wenn Sie möchten, dass neue Spalten Jahr und Monat getrennt anzeigen, können Sie dies tun:
oder...
Dann können Sie sie kombinieren oder so arbeiten, wie sie sind.
quelle
timeit
deuten darauf hin, dass derDatetimeIndex
Ansatz erheblich schneller ist als entweder.map/.apply
oder.dt
.df['date_column_trunc'] = df[date_column'].apply(lambda s: datetime.date(s.year, s.month, 1)
Bester Weg gefunden !!
Das
df['date_column']
muss im Datums- / Uhrzeitformat sein.Sie können auch
D
für Tag,2M
2 Monate usw. für verschiedene Abtastintervalle verwenden. Wenn Zeitreihendaten mit Zeitstempel vorliegen, können Sie granulare Abtastintervalle verwenden, z. B.45Min
für 45 Minuten,15Min
für 15 Minuten Abtastung usw.quelle
datetime64
Typ dtype ist. Wenn Siedf.my_date_column.astype('datetime64[M]')
wie in @ Juans Antwort verwenden , werden Daten in Daten konvertiert, die den ersten Tag eines jeden Monats darstellen.Sie können direkt auf die Attribute
year
und zugreifenmonth
oder Folgendes anforderndatetime.datetime
:Eine Möglichkeit, Jahr und Monat zu kombinieren, besteht darin, eine Ganzzahl zu erstellen, die sie codiert, z. B.:
201408
Für August 2014. In einer ganzen Spalte können Sie Folgendes tun:oder viele Varianten davon.
Ich bin jedoch kein großer Fan davon, da dies die Datumsausrichtung und Arithmetik später schmerzhaft macht und besonders für andere schmerzhaft ist, die auf Ihren Code oder Ihre Daten ohne dieselbe Konvention stoßen. Eine bessere Möglichkeit besteht darin, eine Tag-Tag-Konvention auszuwählen, z. B. den letzten Wochentag außerhalb der USA oder den ersten Tag usw., und die Daten in einem Datums- / Zeitformat mit der gewählten Datumskonvention zu belassen.
Das
calendar
Modul ist nützlich, um den Zahlenwert bestimmter Tage zu ermitteln, z. B. den letzten Wochentag. Dann könnten Sie so etwas tun wie:Wenn Sie nach einer Möglichkeit suchen, das einfachere Problem zu lösen, bei dem nur die datetime-Spalte in eine String-Darstellung formatiert wird, können Sie einfach die
strftime
Funktion aus derdatetime.datetime
Klasse wie folgt verwenden :quelle
pandas
Split-Apply-Combine-Techniken bestmöglich zu nutzen . Meine obigen Vorschläge sind nicht als Bestätigung dafür zu verstehen, dass sie die performantesten Ansätze für Ihren Fall sind - nur, dass sie stilistisch gültige pythonische Entscheidungen für eine Reihe von Fällen sind.df['YearMonth'] = df['ArrivalDate'].map(lambda x: 1000*x.year + x.month)
.Wenn Sie das einzigartige Paar für das Monat und Jahr möchten, ist die Verwendung von apply ziemlich elegant.
Gibt Monat-Jahr in einer Spalte aus.
Vergessen Sie nicht, zuerst das Format auf Datum und Uhrzeit zu ändern, ich vergesse es im Allgemeinen.
quelle
df['month_year'] = df['date_column'].dt.strftime('%B-%Y')
Auszug aus dem Jahr sagen aus ['2018-03-04']
Das df ['Jahr'] erstellt eine neue Spalte. Wenn Sie den Monat extrahieren möchten, verwenden Sie einfach .month
quelle
Sie können Ihre Datumszeichenfolgen zuerst mit pandas.to_datetime konvertieren , wodurch Sie auf alle numpy datetime und timedelta zugreifen können können. Beispielsweise:
quelle
trunc
. Gibt es Unterlagen für dieastype('datetime64[M]')
Konvention?Dank jaknap32 wollte ich die Ergebnisse nach Jahr und Monat aggregieren, also funktionierte dies:
Die Ausgabe war ordentlich:
quelle
Die Lösung von @ KieranPC ist der richtige Ansatz für Pandas, kann jedoch für beliebige Attribute nicht einfach erweitert werden. Hierzu können Sie
getattr
innerhalb eines Generatorverständnisses verwenden und kombinieren mitpd.concat
:quelle
Das funktionierte gut für mich, ich dachte nicht, dass Pandas das resultierende String-Datum als Datum interpretieren würden, aber als ich die Handlung machte, wusste es sehr gut, dass meine Agenda und der String year_month richtig bestellt wurden ... ich muss Pandas lieben!
quelle
Es gibt zwei Schritte, um das Jahr für den gesamten Datenrahmen zu extrahieren, ohne die Methode apply anzuwenden.
Schritt 1
Konvertieren Sie die Spalte in datetime:
Schritt 2
Extrahieren Sie das Jahr oder den Monat mit der
DatetimeIndex()
Methodequelle
SINGLE LINE: Hinzufügen einer Spalte mit 'Jahr-Monat'-Paaren: (' pd.to_datetime 'ändert zuerst den Spaltentyp in Datum-Uhrzeit vor der Operation)
Dementsprechend für eine zusätzliche Spalte "Jahr" oder "Monat":
quelle