2016-09-21 2 views
6

Ich habe einen gigantischen Datenrahmen mit einer Datetime-Typ-Spalte namens dt, der Datenrahmen ist bereits basierend auf dt sortiert. Ich möchte den Datenrahmen in mehrere Datenrahmen basierend auf dt teilen, jeder Datenrahmen enthält Zeilen innerhalb 1 hr Bereich.Pandas, wie man Datenrahmen spaltenweise nach Intervall aufteilt

Split

dt     text 
0 20160811 11:05  a 
1 20160811 11:35  b 
2 20160811 12:03  c 
3 20160811 12:36  d 
4 20160811 12:52  e 
5 20160811 14:32  f 

in

dt     text 
0 20160811 11:05  a 
1 20160811 11:35  b 
2 20160811 12:03  c 

    dt     text 
0 20160811 12:36  d 
1 20160811 12:52  e 

    dt     text 
0 20160811 14:32  f 
+0

in Form einer Frage - nicht ein "Ich will". – charlesreid1

Antwort

7

Sie müssen groupby durch Differenz von ersten Wert der Spalte dt-hour von astype umgewandelt:

S = pd.to_datetime(df.dt) 
for i, g in df.groupby([(S - S[0]).astype('timedelta64[h]')]): 
     print (g.reset_index(drop=True)) 

       dt text 
0 20160811 11:05 a 
1 20160811 11:35 b 
2 20160811 12:03 c 
       dt text 
0 20160811 12:36 d 
1 20160811 12:52 e 
       dt text 
0 20160811 14:32 f 

List comprehension so lution:

S = pd.to_datetime(df.dt) 

print ((S - S[0]).astype('timedelta64[h]')) 
0 0.0 
1 0.0 
2 0.0 
3 1.0 
4 1.0 
5 3.0 
Name: dt, dtype: float64 

L = [g.reset_index(drop=True) for i, g in df.groupby([(S - S[0]).astype('timedelta64[h]')])] 

print (L[0]) 
       dt text 
0 20160811 11:05 a 
1 20160811 11:35 b 
2 20160811 12:03 c 

print (L[1]) 
       dt text 
0 20160811 12:36 d 
1 20160811 12:52 e 

print (L[2]) 
       dt text 
0 20160811 14:32 f 

Alte Lösung, die durch hour aufgeteilt:

Sie groupby von dt.hour verwenden können, aber zuerst konvertieren dtto_datetime:

for i, g in df.groupby([pd.to_datetime(df.dt).dt.hour]): 
    print (g.reset_index(drop=True)) 

       dt text 
0 20160811 11:05 a 
1 20160811 11:35 b 
       dt text 
0 20160811 12:03 c 
1 20160811 12:36 d 
2 20160811 12:52 e 
       dt text 
0 20160811 14:32 f 

List comprehension Lösung:

L = [g.reset_index(drop=True) for i, g in df.groupby([pd.to_datetime(df.dt).dt.hour])] 

print (L[0]) 
       dt text 
0 20160811 11:05 a 
1 20160811 11:35 b 

print (L[1]) 
       dt text 
0 20160811 12:03 c 
1 20160811 12:36 d 
2 20160811 12:52 e 

print (L[2]) 
       dt text 
0 20160811 14:32 f 

Oder verwenden list comprehension mit Spalte Umwandlung dt-datetime:

df.dt = pd.to_datetime(df.dt) 
L =[g.reset_index(drop=True) for i, g in df.groupby([df['dt'].dt.hour])] 

print (L[1]) 
        dt text 
0 2016-08-11 12:03:00 c 
1 2016-08-11 12:36:00 d 
2 2016-08-11 12:52:00 e 

print (L[2]) 
        dt text 
0 2016-08-11 14:32:00 f 

Wenn von date s und hour s aufgeteilt Bedarf:

#changed dataframe for testing 
print (df) 
       dt text 
0 20160811 11:05 a 
1 20160812 11:35 b 
2 20160813 12:03 c 
3 20160811 12:36 d 
4 20160811 12:52 e 
5 20160811 14:32 f 

serie = pd.to_datetime(df.dt) 
for i, g in df.groupby([serie.dt.date, serie.dt.hour]): 
    print (g.reset_index(drop=True)) 
       dt text 
0 20160811 11:05 a 
       dt text 
0 20160811 12:36 d 
1 20160811 12:52 e 
       dt text 
0 20160811 14:32 f 
       dt text 
0 20160812 11:35 b 
       dt text 
0 20160813 12:03 c  
+0

Danke, was ist, wenn ich nach 2 Stunden gruppieren möchte? – 9blue

+0

Ich denke, du brauchst nur '2' hinzufügen,' astype ('timedelta64 [2h]')) ' – jezrael

2

nehmen Sie die Differenz der Termine mit erstem Datum und Gruppe von total_seconds

df.groupby((df.dt - df.dt[0]).dt.total_seconds() // 3600, 
      as_index=False).apply(pd.DataFrame.reset_index, drop=True) 

enter image description here

Verwandte Themen