如何在Pandas DataFrame中为<30分钟间隔插入1分钟频率的合成行
问题
给定如下Pandas DataFrame:
import pandas as pd ts = ['2008-01-02 06:50:00', '2008-01-02 06:51:00', '2008-01-02 06:53:00', '2008-01-02 06:54:00', '2008-01-02 06:57:00', '2008-01-02 06:58:00', '2008-01-02 07:39:00'] a = [1, 2, 3, 4, 5, 6, 7] b = [11, 22, 33, 44, 55, 66, 77] df = pd.DataFrame({'ts':ts, 'a':a, 'b':b})
原始数据展示:
ts a b 0 2008-01-02 06:50:00 1 11 1 2008-01-02 06:51:00 2 22 2 2008-01-02 06:53:00 3 33 3 2008-01-02 06:54:00 4 44 4 2008-01-02 06:57:00 5 55 5 2008-01-02 06:58:00 6 66 6 2008-01-02 07:39:00 7 77
需求:仅在相邻行时间间隔小于30分钟时,插入1分钟间隔的合成行。合成行规则:
a值取自前一行的数值b值设为0
期望输出:
ts a b 0 2008-01-02 06:50:00 1 11 1 2008-01-02 06:51:00 2 22 2 2008-01-02 06:52:00 2 0 3 2008-01-02 06:53:00 3 33 4 2008-01-02 06:54:00 4 44 5 2008-01-02 06:55:00 4 0 6 2008-01-02 06:56:00 4 0 7 2008-01-02 06:57:00 5 55 8 2008-01-02 06:58:00 6 66 9 2008-01-02 07:39:00 7 77
解决方案
以下代码可实现需求:
import pandas as pd # 初始化原始数据 ts = ['2008-01-02 06:50:00', '2008-01-02 06:51:00', '2008-01-02 06:53:00', '2008-01-02 06:54:00', '2008-01-02 06:57:00', '2008-01-02 06:58:00', '2008-01-02 07:39:00'] a = [1, 2, 3, 4, 5, 6, 7] b = [11, 22, 33, 44, 55, 66, 77] df = pd.DataFrame({'ts':ts, 'a':a, 'b':b}) # 转换时间列并设为索引 df['ts'] = pd.to_datetime(df['ts']) df = df.set_index('ts') # 生成完整的1分钟间隔时间序列 full_time = pd.date_range(start=df.index.min(), end=df.index.max(), freq='1min') # 重新索引填充缺失时间点 df_expanded = df.reindex(full_time) # 标记可填充的区间:与前一个原始行间隔<30分钟的非原始行 original_mask = df_expanded.index.isin(df.index) df_expanded['prev_original'] = df_expanded.index.where(original_mask).ffill() time_gap = df_expanded.index - df_expanded['prev_original'] fill_mask = (time_gap < pd.Timedelta(minutes=30)) & (~original_mask) # 填充a值,设置b值为0 df_expanded['a'] = df_expanded['a'].ffill() df_expanded.loc[fill_mask, 'b'] = 0 # 过滤掉不需要保留的行(间隔≥30分钟的缺失行) df_result = df_expanded[original_mask | fill_mask].reset_index().rename(columns={'index':'ts'}) print(df_result)
代码说明
- 时间列处理:将
ts转为datetime类型并设为索引,方便后续时间序列操作 - 生成完整时间序列:用
date_range生成覆盖原始数据时间范围的1分钟间隔序列 - 标记可填充区间:通过向前填充原始时间点,计算当前行与前一个原始行的间隔,筛选出符合条件的填充行
- 填充与过滤:对
a列向前填充,符合条件的行b设为0,最后过滤掉不需要保留的行,重置索引得到最终结果
内容的提问来源于stack exchange,提问作者Baron Yugovich
相关产品推荐
相关产品推荐

