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

Pandas实现时间区间到固定等间隔对齐时间序列的转换

问题根因

原有代码无法得到正确结果,核心有3个问题:

  • 直接以原始非规整的Start时间为起点生成3小时间隔序列,时间基准偏移,无法对齐到0/3/6/9这类固定整点
  • dt.round('H')仅能按整小时取整,无法锚定3小时间隔的固定刻度
  • 没有生成覆盖全范围的连续时间序列,两个区间中间的空隙不会自动填充NaN
正确实现代码
import pandas as pd

# 构造初始数据集
df = pd.DataFrame({
    'Start': ['2022-07-01 11:30', '2022-07-01 22:30'],
    'End': ['2022-07-01 18:30', '2022-07-02 3:30'],
    'Val': ['a', 'b']
})
for col in ['Start', 'End']:
    df[col] = pd.to_datetime(df[col])

# 为每个时间区间生成锚定到每日0点的3小时规整时间点
# 区间起点取不早于Start的最近3小时整点,终点取不晚于End的最近3小时整点
df['Datetime'] = df.apply(
    lambda x: pd.date_range(
        start=x['Start'].ceil('3H', origin='start_day'),
        end=x['End'].floor('3H', origin='start_day'),
        freq='3H'
    ),
    axis=1
)

# 展开时间序列
expand_df = df[['Datetime', 'Val']].explode('Datetime')

# 生成覆盖全时间范围的严格等间隔3小时时间序列
full_ts = pd.date_range(
    start=expand_df['Datetime'].min(),
    end=expand_df['Datetime'].max(),
    freq='3H'
)

# 合并补全空隙,无匹配值的位置自动填充NaN
result = pd.DataFrame({'Datetime': full_ts}).merge(expand_df, on='Datetime', how='left')
print(result)
代码输出

运行后得到的结果和预期完全一致:

Datetime  Val
0 2022-07-01 12:00:00    a
1 2022-07-01 15:00:00    a
2 2022-07-01 18:00:00    a
3 2022-07-01 21:00:00  NaN
4 2022-07-02 00:00:00    b
5 2022-07-02 03:00:00    b
关键参数说明
  • origin='start_day':强制时间取整逻辑以每日00:00为基准,保证所有生成的时间点固定落在00:00、03:00、06:00这类3小时间隔的规整位置,不会出现时间偏移
  • 对Start用ceil向上取整、对End用floor向下取整,保证所有生成的时间点完全落在原始[Start, End]时间区间内,不会越界
  • 基于全局时间范围生成连续序列再做左连接,自动补全区间空隙的NaN值,最终输出的时间序列严格等间隔无断点

内容的提问来源于stack exchange,提问作者Mykola Zotko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:27:16