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
相关产品推荐
相关产品推荐

