Python 如何按间隔按列拆分数据帧

Python 如何按间隔按列拆分数据帧,python,python-2.7,pandas,numpy,scipy,Python,Python 2.7,Pandas,Numpy,Scipy,我有一个巨大的数据框,它有一个日期时间类型的列,名为dt,数据框已经基于dt进行了排序。我想根据dt将数据帧拆分为几个数据帧,每个数据帧包含1小时范围内的行 分裂 进入 您需要通过以下方式将列dt的第一个值的差值转换为hour: 列表理解解决方案: 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

我有一个巨大的数据框,它有一个日期时间类型的列,名为
dt
,数据框已经基于
dt
进行了排序。我想根据
dt
将数据帧拆分为几个数据帧,每个数据帧包含
1小时范围内的行

分裂

进入

您需要通过以下方式将列
dt
的第一个值的差值转换为
hour

列表理解
解决方案:

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

小时划分的旧解决方案

您可以通过使用,但首先需要转换
dt

列表理解
解决方案:

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

或者使用
列表理解
将列
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

如果需要按
日期
s和
小时
s进行拆分:

#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    

将日期与第一个日期的差值和分组的总秒数进行比较

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

谢谢,如果我想按2小时分组怎么办?我想你只需要添加
2
aType('timedelta64[2h])
以问题的形式提问,而不是“我想要”。
#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    
df.groupby((df.dt - df.dt[0]).dt.total_seconds() // 3600,
           as_index=False).apply(pd.DataFrame.reset_index, drop=True)