如何对Pandas 10天小时时间序列按跨日23:00-02:00时段分组?
解决Pandas跨天时间窗口分组的问题
嘿,这个跨天时间窗口分组的需求确实有点绕,不过咱们可以一步步拆解搞定它!核心思路是给每个符合时间窗口的样本分配唯一的组ID,然后用groupby按ID分组就行。下面是具体的实现步骤:
前提准备
首先确保你的Series的索引是DatetimeIndex,如果不是的话,先转换:
import pandas as pd # 假设你的Series叫ts ts.index = pd.to_datetime(ts.index)
步骤1:筛选符合时间窗口的数据
我们只需要保留小时为23:00、00:00、01:00、02:00的记录:
# 筛选目标小时的时间点 filtered_ts = ts[ts.index.hour.isin([23, 0, 1, 2])]
步骤2:生成组ID
关键来了:我们需要把同一个跨天窗口的时间点映射到同一个组ID。规则是:
- 对于
23:00的时间点,组ID就是它的日期(比如2023-01-01 23:00的组ID是2023-01-01) - 对于
00:00、01:00、02:00的时间点,组ID是它的日期往前推1天(比如2023-01-02 00:00的组ID是2023-01-01,这样就和前一天的23点分到一组)
代码实现:
# 先基于索引日期生成初始组ID group_ids = filtered_ts.index.date # 对凌晨0-2点的记录,把组ID往前推1天 mask = filtered_ts.index.hour.isin([0, 1, 2]) group_ids[mask] = group_ids[mask] - pd.Timedelta(days=1) # 转成Series方便后续分组 group_ids = pd.Series(group_ids, index=filtered_ts.index)
步骤3:按组ID分组
现在直接用groupby分组即可:
grouped = filtered_ts.groupby(group_ids)
验证结果
你可以遍历分组查看每组的时间范围,确认是否符合预期:
for group_date, group_data in grouped: print(f"组 {group_date}:") print(f"时间范围:{group_data.index.min()} 到 {group_data.index.max()}") print("-" * 30)
对于10天的小时级数据,你会得到11组:比如第一天的凌晨0-2点属于前一天日期的组,之后每天的23点和次日0-2点各成一组,直到第10天的23点组成最后一组,正好是11个分组。
内容的提问来源于stack exchange,提问作者Haroon Lone
相关产品推荐
相关产品推荐

