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

如何在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)

代码说明

  1. 时间列处理:将ts转为datetime类型并设为索引,方便后续时间序列操作
  2. 生成完整时间序列:用date_range生成覆盖原始数据时间范围的1分钟间隔序列
  3. 标记可填充区间:通过向前填充原始时间点,计算当前行与前一个原始行的间隔,筛选出符合条件的填充行
  4. 填充与过滤:对a列向前填充,符合条件的行b设为0,最后过滤掉不需要保留的行,重置索引得到最终结果

内容的提问来源于stack exchange,提问作者Baron Yugovich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:05:01