按时间窗口对数据框进行分区
我有一个数据表,其中有一列是日期:
我想根据时间把这个数据表分成三个小表:
- 00:00-12:00。
- 12:00-18:00。
- 18:00-24:00。
我该如何在不使用循环的情况下实现这个目标呢?
我可以通过对每个时间戳使用循环来实现这个功能,但这样做速度很慢。
可以通过以下方式生成一些示例数据:
df = pd.DataFrame(pd.date_range(start='2024-01-01', end='2024-01-10', freq='10min'))
df['data'] = np.random.randint(100, size=len(df))
df.columns = ['date', 'data']
2 个回答
1
你可以把标准化的日期减去,这样就能得到一个时间差,称为timedelta。然后你可以用cut
和groupby
来处理这些数据:
# ensure datetime
df['Date'] = pd.to_datetime(df['Date'])
# form bins, split groups
bins = ['0', '12h', '18h', '24h']
labels = [f'{bins[i]}-{bins[i+1]}' for i in range(len(bins)-1)]
out = dict(list(df.groupby(pd.cut(df['Date'].sub(df['Date'].dt.normalize()),
[pd.Timedelta(x) for x in bins],
labels=labels, include_lowest=True))))
输出结果:
{'0-12h': Date
0 2023-01-01 00:00:00
1 2023-01-01 00:10:00
2 2023-01-01 00:20:00
3 2023-01-01 00:30:00
4 2023-01-01 00:40:00
... ...
1221 2023-01-09 11:30:00
1222 2023-01-09 11:40:00
1223 2023-01-09 11:50:00
1224 2023-01-09 12:00:00
1296 2023-01-10 00:00:00
[658 rows x 1 columns],
'12h-18h': Date
73 2023-01-01 12:10:00
74 2023-01-01 12:20:00
75 2023-01-01 12:30:00
76 2023-01-01 12:40:00
77 2023-01-01 12:50:00
... ...
1256 2023-01-09 17:20:00
1257 2023-01-09 17:30:00
1258 2023-01-09 17:40:00
1259 2023-01-09 17:50:00
1260 2023-01-09 18:00:00
[324 rows x 1 columns],
'18h-24h': Date
109 2023-01-01 18:10:00
110 2023-01-01 18:20:00
111 2023-01-01 18:30:00
112 2023-01-01 18:40:00
113 2023-01-01 18:50:00
... ...
1291 2023-01-09 23:10:00
1292 2023-01-09 23:20:00
1293 2023-01-09 23:30:00
1294 2023-01-09 23:40:00
1295 2023-01-09 23:50:00
[315 rows x 1 columns],
}
使用的输入数据:
df = pd.DataFrame({'Date': pd.date_range('2023-01-01', '2023-01-10', freq='10min')})
1
这里还有一个其他的选择。你可以使用pandas来过滤数据框,这样就能得到你想要的三个新数据框。我借用了@mozway的模拟输入,所以请给他们一些认可。
import pandas as pd
df = pd.DataFrame({'DateWithTime': pd.date_range('2023-01-01', '2023-01-10', freq='10min')})
df['Hour']= df['DateWithTime'].dt.hour
df1=df[df['Hour'].isin(range(0,13))]
df2=df[df['Hour'].isin(range(13,19))]
df3=df[df['Hour'].isin(range(19,25))]
display(df)
display(df1)
display(df2)
display(df3)
这里是原始的数据框和过滤后的数据框。
DateWithTime Hour
0 2023-01-01 00:00:00 0
1 2023-01-01 00:10:00 0
2 2023-01-01 00:20:00 0
3 2023-01-01 00:30:00 0
4 2023-01-01 00:40:00 0
... ... ...
1292 2023-01-09 23:20:00 23
1293 2023-01-09 23:30:00 23
1294 2023-01-09 23:40:00 23
1295 2023-01-09 23:50:00 23
1296 2023-01-10 00:00:00 0
1297 rows × 2 columns
DateWithTime Hour
0 2023-01-01 00:00:00 0
1 2023-01-01 00:10:00 0
2 2023-01-01 00:20:00 0
3 2023-01-01 00:30:00 0
4 2023-01-01 00:40:00 0
... ... ...
1226 2023-01-09 12:20:00 12
1227 2023-01-09 12:30:00 12
1228 2023-01-09 12:40:00 12
1229 2023-01-09 12:50:00 12
1296 2023-01-10 00:00:00 0
703 rows × 2 columns
DateWithTime Hour
78 2023-01-01 13:00:00 13
79 2023-01-01 13:10:00 13
80 2023-01-01 13:20:00 13
81 2023-01-01 13:30:00 13
82 2023-01-01 13:40:00 13
... ... ...
1261 2023-01-09 18:10:00 18
1262 2023-01-09 18:20:00 18
1263 2023-01-09 18:30:00 18
1264 2023-01-09 18:40:00 18
1265 2023-01-09 18:50:00 18
324 rows × 2 columns
DateWithTime Hour
114 2023-01-01 19:00:00 19
115 2023-01-01 19:10:00 19
116 2023-01-01 19:20:00 19
117 2023-01-01 19:30:00 19
118 2023-01-01 19:40:00 19
... ... ...
1291 2023-01-09 23:10:00 23
1292 2023-01-09 23:20:00 23
1293 2023-01-09 23:30:00 23
1294 2023-01-09 23:40:00 23
1295 2023-01-09 23:50:00 23
270 rows × 2 columns