熊猫如何按时间间隔按列分割数据帧

问题描述:

我有一个巨大的数据帧,其日期时间类型列名为dt,数据帧已经基于dt排序。我想根据dt将数据帧分成几个数据帧,每个数据帧包含1 hr范围内的行。熊猫如何按时间间隔按列分割数据帧

拆分

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 

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

问一个问题的形式 - 不是 “我要”。 – charlesreid1

您可以通过转换为hourdt的第一价值的差额,需要通过groupbyastype

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所以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 

旧的解决方案,其分裂的hour

您可以通过dt.hour使用groupby,但首先需要转换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 = [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 

或者使用list comprehension与转换列dtdatetime

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 

如果需要通过date S和hour而分裂:

#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

谢谢,如果我想分组2小时? – 9blue

+0

我想你只需要添加'2','astype('timedelta64 [2h]'))' – jezrael

取红枣的差异与第一次约会和小组通过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