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

