405 Stimmen

Extrahieren von nur Monat und Jahr getrennt aus Pandas-Datumszeitspalte

Ich habe einen Dataframe, df, mit der folgenden Spalte:

     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 vom Typ pandas.tslib.Timestamp. Ich möchte das Jahr und den Monat extrahieren.

Hier ist, was ich versucht habe:

df['ArrivalDate'].resample('M', how = 'mean')

das wirft den folgenden Fehler:

Nur gültig mit DatetimeIndex oder PeriodIndex 

Dann habe ich versucht:

df['ArrivalDate'].apply(lambda(x):x[:-2])

das wirft den folgenden Fehler:

'Timestamp' object hat kein Attribut '__getitem__' 

Meine aktuelle Lösung ist

df.index = df['ArrivalDate']

Dann kann ich eine andere Spalte mit dem Index resamplen.

Aber ich würde immer noch eine Methode wünschen, um die gesamte Spalte neu zu konfigurieren. Irgendwelche Ideen?

613voto

KieranPC Punkte 7565

Wenn Sie neue Spalten möchten, die Jahr und Monat separat anzeigen, können Sie dies tun:

df['year'] = pd.DatetimeIndex(df['ArrivalDate']).year
df['month'] = pd.DatetimeIndex(df['ArrivalDate']).month

oder...

df['year'] = df['ArrivalDate'].dt.year
df['month'] = df['ArrivalDate'].dt.month

Dann können Sie sie kombinieren oder einfach mit ihnen arbeiten.

371voto

kabrapankaj32 Punkte 4680

Die df['date_column'] muss im Datums-Zeit-Format sein.

df['month_year'] = df['date_column'].dt.to_period('M')

Sie können auch D für Tag, 2M für 2 Monate usw. für verschiedene Abtastintervalle verwenden, und für Zeitreihendaten mit Zeitstempel können wir für granulare Abtastintervalle wie 45Min für 45 Minuten, 15Min für 15 Minuten usw. gehen.

165voto

ely Punkte 69114

Sie können direkt auf die Jahr und Monat Attribute zugreifen oder ein datetime.datetime anfordern:

In [15]: t = pandas.tslib.Timestamp.now()

In [16]: t
Out[16]: Timestamp('2014-08-05 14:49:39.643701', tz=None)

In [17]: t.to_pydatetime() #datetime method is deprecated
Out[17]: datetime.datetime(2014, 8, 5, 14, 49, 39, 643701)

In [18]: t.day
Out[18]: 5

In [19]: t.month
Out[19]: 8

In [20]: t.year
Out[20]: 2014

Eine Möglichkeit, Jahr und Monat zu kombinieren, besteht darin, sie als Ganzzahl zu kodieren, z. B. 201408 für August 2014. Für eine ganze Spalte könnten Sie dies wie folgt tun:

df['YearMonth'] = df['ArrivalDate'].map(lambda x: 100*x.year + x.month)

oder viele Varianten davon.

Allerdings bin ich kein großer Fan davon, da dies das spätere Ausrichten und Rechnen von Daten schmerzhaft macht und insbesondere für andere, die auf Ihren Code oder Ihre Daten stoßen, ohne diese gleiche Konvention, sehr schmerzhaft wird. Ein besserer Weg ist es, eine Tageskonvention, wie z.B. den letzten Nicht-US-Feiertag-Wochentag oder den ersten Tag etc. auszuwählen, und die Daten in einem Datum-/Zeitformat mit der gewählten Datumskonvention zu belassen.

Das calendar Modul ist nützlich, um den Zahlwert bestimmter Tage wie den letzten Wochentag zu erhalten. Dann könnten Sie etwas Ähnliches tun wie:

import calendar
import datetime
df['AdjustedDateToEndOfMonth'] = df['ArrivalDate'].map(
    lambda x: datetime.datetime(
        x.year,
        x.month,
        max(calendar.monthcalendar(x.year, x.month)[-1][:5])
    )
)

Wenn Sie zufällig nach einer Möglichkeit suchen, das einfachere Problem zu lösen, die Datums-/Uhrzeitspalte in eine stringähnliche Darstellung zu formatieren, können Sie dafür einfach die strftime Funktion aus der datetime.datetime Klasse verwenden, so wie hier:

In [5]: df
Out[5]: 
            date_time
0 2014-10-17 22:00:03

In [6]: df.date_time
Out[6]: 
0   2014-10-17 22:00:03
Name: date_time, dtype: datetime64[ns]

In [7]: df.date_time.map(lambda x: x.strftime('%Y-%m-%d'))
Out[7]: 
0    2014-10-17
Name: date_time, dtype: object

50voto

kabrapankaj32 Punkte 4680

Wenn Sie das einzigartige Monatsjahrespärchen möchten, ist die Verwendung von apply ziemlich geschickt.

df['mnth_yr'] = df['date_column'].apply(lambda x: x.strftime('%B-%Y')) 

Gibt Monat-Jahr in einer Spalte aus.

Vergessen Sie nicht, zuerst das Format in Datum/Uhrzeit zu ändern, das vergesse ich im Allgemeinen.

df['date_column'] = pd.to_datetime(df['date_column'])

33voto

Matthi9000 Punkte 1146

EINE ZEILE: Hinzufügen einer Spalte mit 'Jahr-Monat'-Paaren: ('pd.to_datetime' ändert zunächst den Spaltentyp in Datum/Uhrzeit, bevor die Operation durchgeführt wird)

df['yyyy-mm'] = pd.to_datetime(df['ArrivalDate']).dt.strftime('%Y-%m')

Entsprechend für eine zusätzliche 'Jahr' oder 'Monat' Spalte:

df['yyyy'] = pd.to_datetime(df['ArrivalDate']).dt.strftime('%Y')
df['mm'] = pd.to_datetime(df['ArrivalDate']).dt.strftime('%m')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X