Python高效向时间序列DataFrame插入指定行的方法
高效实现每日插入指定行的方案
核心思路
用Pandas的向量化操作替代逐行循环,通过筛选每日首尾行、批量生成新行再合并排序的方式,实现高效处理。
步骤代码
- 确保日期列类型正确
先把date列转为带时区的datetime类型,避免时间计算错误:
import pandas as pd # 假设你的原始DataFrame名为df df['date'] = pd.to_datetime(df['date'], utc=True)
- 筛选每日首尾行
先按时间排序,再提取每天的9:15首行和18:30末行:
# 按时间排序,保证数据时序正确 df = df.sort_values('date').reset_index(drop=True) # 提取每天9:15的行 daily_first = df[df['date'].dt.time == pd.to_datetime('09:15:00').time()] # 提取每天18:30的行 daily_last = df[df['date'].dt.time == pd.to_datetime('18:30:00').time()]
- 批量生成待插入的新行
利用向量运算生成所有新行的字段:
# 新行的时间:当天9:15减1分钟 new_dates = daily_first['date'] - pd.Timedelta(minutes=1) # 新行的x值:前一天18:30行的y值(第一天无前置数据,设为NaN,可按需调整) new_x = daily_last['y'].shift(1).values new_x[0] = pd.NA # 可替换成你需要的默认值,比如daily_first['x'].iloc[0] # 新行的y值:当天9:15行的x值 new_y = daily_first['x'].values # 构造新行DataFrame new_rows = pd.DataFrame({ 'date': new_dates, 'x': new_x, 'y': new_y })
- 合并并排序
把新行和原数据合并后按时间排序,确保新行处于正确位置:
# 合并原数据与新行 combined_df = pd.concat([df, new_rows], ignore_index=True) # 按时间排序,保证新行在当天9:15行之前 combined_df = combined_df.sort_values('date').reset_index(drop=True)
关键注意事项
- 如果原数据中存在某天缺失9:15或18:30行的情况,可改用
groupby(df['date'].dt.date).first()/.last()来获取每日首尾行,替代直接筛选时间。 - 时区处理要统一,避免跨时区计算出错。
- 该方案全程用向量化操作,没有逐行循环,处理45天数据的速度会比循环实现快几个数量级,也不会产生多余的错误列。
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

