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

Pandas按时间规则将df1的A列数据填充至df2的新列CC

问题描述

现有两个DataFrame:

df1 结构

A            time
0   32  2023-09-30 08:00:00
1   18  2023-09-30 08:01:00
2   61  2023-09-30 08:02:00
3   87  2023-09-30 08:03:00
4   46  2023-09-30 08:04:00
5   18  2023-09-30 08:05:00
6   65  2023-09-30 08:06:00
7   18  2023-09-30 08:07:00
8   10  2023-09-30 08:08:00
9   93  2023-09-30 08:09:00

df2 结构

AA  BB          Timestamp
0   27  54  2023-10-03 11:57:57.898397
1   28  56  2023-10-03 11:57:59.398397
2   29  58  2023-10-03 11:58:00.898397
3   30  60  2023-10-03 11:58:02.398397
4   31  62  2023-10-03 11:58:03.898397
5   32  64  2023-10-03 11:58:05.398397
6   33  66  2023-10-03 11:58:06.898397
7   34  68  2023-10-03 11:58:08.398397
8   35  70  2023-10-03 11:59:04.398397

需求说明

将df1中指定时间范围(示例:2023-09-30 08:02:00 至 2023-09-30 08:08:00)的A列数据,填充到df2的新列CC中。填充规则:从指定时间范围的起始点开始,每当df2中累计满1分钟数据,就切换到df1的下一条A列数据,直至填满df2。

预期输出

AA  BB            Timestamp         CC
0   27  54  2023-10-03 11:57:57.898397  61
1   28  56  2023-10-03 11:57:59.398397  61
2   29  58  2023-10-03 11:58:00.898397  87
3   30  60  2023-10-03 11:58:02.398397  87
4   31  62  2023-10-03 11:58:12.898397  87
5   32  64  2023-10-03 11:58:24.398397  87
6   33  66  2023-10-03 11:58:40.898397  87
7   34  68  2023-10-03 11:58:52.398397  87
8   35  70  2023-10-03 11:59:04.398397  46

实际场景规模

df1为跨度1周、分钟粒度的10500行数据;df2为跨度20小时、毫秒粒度的472963行数据,需保证方案高效可行。

实现方案

步骤1:统一时间格式,转换为datetime类型

确保两个DataFrame的时间列都是datetime64类型,方便后续计算:

import pandas as pd

# 转换df1的time列
df1['time'] = pd.to_datetime(df1['time'])
# 转换df2的Timestamp列
df2['Timestamp'] = pd.to_datetime(df2['Timestamp'])

步骤2:筛选df1的目标时间范围数据

提取指定时间区间内的A列数据,作为填充序列:

# 定义时间范围
start_time = pd.to_datetime('2023-09-30 08:02:00')
end_time = pd.to_datetime('2023-09-30 08:08:00')

# 筛选数据,得到填充用的A序列
fill_series = df1.loc[(df1['time'] >= start_time) & (df1['time'] <= end_time), 'A'].reset_index(drop=True)

步骤3:计算df2时间相对于起始点的分钟偏移量

以df2的第一条数据时间为基准,计算每条数据与基准的时间差,转换为分钟数后取整数部分,得到每个数据对应的填充索引:

# 取df2的第一条时间作为计算基准
df2_base_time = df2['Timestamp'].iloc[0]

# 计算每条数据与基准的时间差(分钟),取整数部分得到偏移量
df2['minute_offset'] = (df2['Timestamp'] - df2_base_time).dt.total_seconds() // 60

# 计算填充索引:偏移量对fill_series的长度取模,循环使用填充序列
df2['cc_index'] = df2['minute_offset'] % len(fill_series)

步骤4:映射填充序列到df2的CC列

通过索引映射,将fill_series的值填充到CC列:

df2['CC'] = fill_series.loc[df2['cc_index']].values

# 清理临时列(可选)
df2.drop(['minute_offset', 'cc_index'], axis=1, inplace=True)

方案优势

  • 全程使用Pandas的矢量化操作,避免循环遍历,处理47万行数据效率极高;
  • 通过取模操作实现填充序列的循环复用,无需担心df2长度超过fill_series的情况;
  • 时间计算基于datetime的内置方法,精度和可靠性有保障。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:15:08