You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中忽略日期按24小时块对DataFrame进行分组?

问题:Pandas按自定义起始小时的24小时块分组DataFrame

需要在Pandas中对DataFrame按24小时块分组,分组起始点为数据中第一个时间戳的小时(比如起始于17点,就分组到次日16点,以此类推)。尝试用pd.Grouper设置freq='24H',但结果还是按自然日分组,不符合预期。

当前实现代码

df_groupby = df_tmp.groupby(pd.Grouper(key='created_at', freq='24H'))
for idx, (_, group_df) in enumerate(df_groupby):
    print(f"Group {idx}:")
    print(group_df[['created_at', 'moisture']])
    print('-------------------')

当前输出

Group 0:
                   created_at  moisture
0  2023-11-18 12:13:12.256927       535
1  2023-11-18 13:13:20.147592       535
2  2023-11-18 14:13:27.097894       535
3  2023-11-18 15:13:25.985715       535
4  2023-11-18 16:13:32.408867       534
5  2023-11-18 17:13:36.298025       534
6  2023-11-18 18:13:43.110883       534
7  2023-11-18 19:13:43.369302       534
8  2023-11-18 20:13:51.632185       534
9  2023-11-18 21:13:59.169360       534
10 2023-11-18 22:14:07.972644       534
11 2023-11-18 23:14:16.297836       533
-------------------
Group 1:
                   created_at  moisture
12 2023-11-19 00:14:26.031192       534
13 2023-11-19 01:14:39.796824       532
14 2023-11-19 02:14:44.249399       533
15 2023-11-19 03:14:53.479820       534
16 2023-11-19 04:14:55.977077       534
17 2023-11-19 05:15:07.361019       534
18 2023-11-19 06:15:11.359716       534
19 2023-11-19 07:15:18.545638       534
20 2023-11-19 08:15:21.923445       534
21 2023-11-19 09:15:44.108795       534
22 2023-11-19 10:15:57.429115       533
23 2023-11-19 11:16:06.081096       534
24 2023-11-19 12:16:13.537274       534
25 2023-11-19 13:16:20.113579       534
26 2023-11-19 14:16:27.592455       534
27 2023-11-19 15:16:40.897159       533
28 2023-11-19 16:16:46.088631       534
29 2023-11-19 17:16:56.356958       533
30 2023-11-19 18:17:07.224618       534
31 2023-11-19 19:17:16.432370       533
32 2023-11-19 20:17:26.111768       533
33 2023-11-19 21:17:34.791802       533
34 2023-11-19 22:17:43.986497       531
35 2023-11-19 23:17:52.805056       532
-------------------
Group 2:
                   created_at  moisture
36 2023-11-20 00:17:54.619490       533
37 2023-11-20 01:18:01.641144       532
38 2023-11-20 02:18:04.765892       532
39 2023-11-20 03:18:12.408328       532
40 2023-11-20 04:18:19.164817       532
41 2023-11-20 05:18:25.246881       532
42 2023-11-20 06:18:30.721551       532
43 2023-11-20 07:18:37.083176       532
44 2023-11-20 08:18:50.404909       532
45 2023-11-20 09:18:57.631082       532
46 2023-11-20 10:19:16.824349       532
47 2023-11-20 11:19:33.221346       532
48 2023-11-20 12:19:42.545535       532
49 2023-11-20 13:19:49.395201       532
50 2023-11-20 14:19:57.886827       532
51 2023-11-20 15:20:06.339089       532
52 2023-11-20 16:20:10.990417       532
53 2023-11-20 17:20:17.104666       532
54 2023-11-20 18:20:22.420334       532
55 2023-11-20 19:20:23.556865       533
56 2023-11-20 20:20:31.798930       531
57 2023-11-20 21:20:35.866586       531
58 2023-11-20 22:20:45.136861       531
59 2023-11-20 23:20:55.456402       531
-------------------

解决方案

要实现从第一个时间戳的小时开始的24小时分组,只需给pd.Grouper添加origin参数,将其设置为DataFrame中最早的created_at时间:

# 获取数据中最早的时间戳作为分组起始点
start_time = df_tmp['created_at'].min()
# 使用origin参数指定分组的起始基准时间
df_groupby = df_tmp.groupby(pd.Grouper(key='created_at', freq='24H', origin=start_time))

for idx, (_, group_df) in enumerate(df_groupby):
    print(f"Group {idx}:")
    print(group_df[['created_at', 'moisture']])
    print('-------------------')

说明

origin参数会让分组从指定的时间点开始计算24小时块,替代默认的自然日零点起始逻辑。这样分组就会以数据中第一个时间点的小时为起点,每24小时划分一组,符合需求。

内容的提问来源于stack exchange,提问作者J. Montgomery

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:24:49