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?

13voto

Juan A. Navarro Punkte 9676

Sie können zuerst Ihre Datumszeichenfolgen mit pandas.to_datetime konvertieren, was Ihnen Zugriff auf alle numpy datetime und timedelta Funktionen gibt. Zum Beispiel:

df['ArrivalDate'] = pandas.to_datetime(df['ArrivalDate'])
df['Monat'] = df['ArrivalDate'].values.astype('datetime64[M]')

10voto

jpp Punkte 146159

@KieranPC's Lösung ist der richtige Ansatz für Pandas, aber nicht leicht erweiterbar für beliebige Attribute. Dafür können Sie getattr innerhalb einer Generator-Liste verwenden und mit pd.concat kombinieren:

# Eingabedaten
list_of_dates = ['2012-12-31', '2012-12-29', '2012-12-30']
df = pd.DataFrame({'ArrivalDate': pd.to_datetime(list_of_dates)})

# Liste der benötigten Attribute definieren    
L = ['year', 'month', 'day', 'dayofweek', 'dayofyear', 'weekofyear', 'quarter']

# Generator-Ausdruck von Serien definieren, eine für jedes Attribut
date_gen = (getattr(df['ArrivalDate'].dt, i).rename(i) for i in L)

# Ergebnisse zusammenführen und an das ursprüngliche DataFrame anhängen
df = df.join(pd.concat(date_gen, axis=1))

print(df)

  ArrivalDate  year  month  day  dayofweek  dayofyear  weekofyear  quarter
0  2012-12-31  2012     12   31          0        366           1        4
1  2012-12-29  2012     12   29          5        364          52        4
2  2012-12-30  2012     12   30          6        365          52        4

8voto

Subspacian Punkte 1967

Dank an jaknap32, ich wollte die Ergebnisse nach Jahr und Monat aggregieren, also hat das funktioniert:

df_join['JahrMonat'] = df_join['timestamp'].apply(lambda x:x.strftime('%Y%m'))

Die Ausgabe war ordentlich:

0    201108
1    201108
2    201108

0voto

TICH Punkte 17
df['year_month']=df.datetime_column.apply(lambda x: str(x)[:7])

Dies hat bei mir gut funktioniert, ich hätte nicht gedacht, dass pandas das resultierende String-Datum als Datum interpretieren würde, aber als ich das Diagramm gemacht habe, wusste es sehr gut über meinen Zeitplan Bescheid und das String-Jahr_Monat war ordentlich geordnet... pandas muss man einfach lieben!

0voto

Jiaxiang Punkte 734

Dann habe ich versucht:

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

Ich denke hier sollte der richtige Eingabetyp ein String sein.

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

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