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)