2016-06-05 4 views
2

Ich bin mein Datenrahmen nach Monat/Tag/Jahr usw. und habe Probleme mit meinem Index von Datetime zu Tuple konvertiert. Ich möchte meinen Index in Datetime haben, damit ich ihn für andere Nicht-Python-Benutzer in Excel exportieren kann, und er hat immer noch Sinn mit Zeitstempeln.Konvertieren von Tuple-Index in einen Datetime-Index

Das, was mein Df wie folgt aussehen:

Index Date Time  Value 
1  1/26/2016 07:00 100000.0  
2  1/26/2016 07:00 1000000.0 
3  1/26/2016 14:46  98.52 
6  1/26/2016 14:46  Nan 
8  1/26/2016 14:48  100.94 
11  1/26/2016 14:48  Nan 

Dies ist der Code-Schnipsel Ich habe Probleme mit:

df_cv_1_grouped = df_cv_1.set_index('Date Time',drop=False) 
year_hour_means = df_cv_1_grouped.groupby(
    lambda x: (x.year, x.month, x.day, x.hour)).mean() 

Der Ausgang ist groß, aber der Index nun ein Tuple (der „Wert "-Spalte ist irrelevant.)

Index    Value 
(2016, 1, 26, 7) 1.5 
(2016, 1, 26, 14) 22.7 
(2016, 1, 26, 15) 125.3 
(2016, 1, 26, 16) 288.5 

ich kann nicht einen Weg zu finden, scheint es in Datetime zurück (oder dort halten) in eine einfache Art und Weise.

+0

Im Moment kann ich nicht mehr tun, aber versuch as_index = False an die groupby-Methode zu übergeben. – piRSquared

+0

Siehe [docs for 'pandas.DataFrame.groupby'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html#pandas-dataframe-groupby) –

+0

zu vermeiden Dieses "Date Time", verwenden Sie lieber "DateTime". Kein Leerzeichen zwischen Wörtern. – Merlin

Antwort

2

ich glaube, Sie indexto_period, groupby von index (level=0) umwandeln kann und dann to_timestamp konvertieren:

df_cv_1_grouped = df_cv_1.set_index('Date Time', drop=False) 

df_cv_1_grouped = df_cv_1_grouped.to_period('H') 
print (df_cv_1_grouped) 
          Date Time  Value 
Date Time          
2016-01-26 07:00 2016-01-26 07:00:00 100000.00 
2016-01-26 07:00 2016-01-26 07:00:00 1000000.00 
2016-01-26 14:00 2016-01-26 14:46:00  98.52 
2016-01-26 14:00 2016-01-26 14:46:00   NaN 
2016-01-26 14:00 2016-01-26 14:48:00  100.94 
2016-01-26 14:00 2016-01-26 14:48:00   NaN 

year_hour_means1 = df_cv_1_grouped.groupby(level=0).mean() 
print (year_hour_means1) 
         Value 
Date Time     
2016-01-26 07:00 550000.00 
2016-01-26 14:00  99.73 

print (year_hour_means1.index) 
PeriodIndex(['2016-01-26 07:00', '2016-01-26 14:00'], 
dtype='int64', name='Date Time', freq='H') 

year_hour_means1 = year_hour_means1.to_timestamp() 
print (year_hour_means1) 
         Value 
Date Time      
2016-01-26 07:00:00 550000.00 
2016-01-26 14:00:00  99.73 

print (year_hour_means1.index) 
DatetimeIndex(['2016-01-26 07:00:00', '2016-01-26 14:00:00'], 
dtype='datetime64[ns]', name='Date Time', freq=None) 

Converting between representations.

+0

Ich habe versucht, warum nicht 15T oder 30S für Zeitraum arbeiten, oder tut es. Und sein Benutzerfehler. – Merlin

+0

Ich denke, wenn Sie zu anderen Frequenzen konvertieren möchten, verwenden Sie [resample] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.resample.html). – jezrael

+0

@jezrael danke ein Haufen! Das hat total funktioniert, und ich werde eher nach der Gruppierung nach Periode als nach der Lambda-Funktion suchen. –

0

Zuerst sollten Sie pd.to_datetime verwenden, um Date Time Werte in datetime zu konvertieren, dann können Sie set_index verwenden.

df['Date Time'] = pd.to_datetime(df['Date Time']) 
df2 = df.set_index('Date Time') 
Verwandte Themen