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

如何对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:56:53