Pandas处理日期差超8天数据:拆分行并同步相关列值
Pandas DataFrame插入间隔行解决方案
需求回顾
当Pandas DataFrame中相邻行的日期间隔(上一行End Date到当前行Start Date的天数)超过8天时,需插入符合规则的新行:
- 新行
Start Date= 上一行End Date - 新行
End Date= 当前行Start Date - 新行
Close1、NF_BEES1= 上一行Close2、NF_BEES2 - 新行
Close2、NF_BEES2= 当前行Close1、NF_BEES1 - 新行
Difference=Close2 - Close1,Days Difference= 新行End Date与Start Date的间隔天数
常见问题排查
原代码未达预期的常见原因:
- 日期列未转换为
datetime类型,导致天数计算失效 - 遍历过程中未动态维护处理后的上一行(仍使用原数据的上一行,忽略已插入的新行)
- 新行的列值映射错误(如
Close1/Close2的来源取反)
实现代码
1. 示例数据准备
import pandas as pd # 构造示例原DataFrame data = { 'Start Date': ['2023-01-01', '2023-01-15', '2023-02-05'], 'End Date': ['2023-01-05', '2023-01-20', '2023-02-10'], 'Close1': [100, 110, 120], 'Close2': [105, 112, 125], 'NF_BEES1': [50, 55, 60], 'NF_BEES2': [52, 56, 62], 'Difference': [5, 2, 5], 'Days Difference': [4, 5, 5] } df = pd.DataFrame(data) # 转换日期列为datetime类型(关键步骤,否则无法正确计算天数) df['Start Date'] = pd.to_datetime(df['Start Date']) df['End Date'] = pd.to_datetime(df['End Date'])
2. 核心处理逻辑
# 存储处理后的所有行数据 processed_rows = [] # 先加入第一行数据作为初始行 processed_rows.append(df.iloc[0].to_dict()) # 从第二行开始遍历原DataFrame for i in range(1, len(df)): # 取处理后的最后一行(可能是原行或已插入的新行)作为上一行 prev_row = processed_rows[-1] current_row = df.iloc[i].to_dict() # 计算上一行End与当前行Start的间隔天数 days_diff = (current_row['Start Date'] - prev_row['End Date']).days # 间隔超过8天则插入新行 if days_diff > 8: new_row = { 'Start Date': prev_row['End Date'], 'End Date': current_row['Start Date'], 'Close1': prev_row['Close2'], 'NF_BEES1': prev_row['NF_BEES2'], 'Close2': current_row['Close1'], 'NF_BEES2': current_row['NF_BEES1'], 'Difference': current_row['Close1'] - prev_row['Close2'], 'Days Difference': days_diff } processed_rows.append(new_row) # 加入当前行数据 processed_rows.append(current_row) # 转换为最终的DataFrame result_df = pd.DataFrame(processed_rows) print(result_df)
输出说明
运行代码后,会自动在日期间隔超8天的位置插入符合规则的新行。例如原数据中第一行End Date(2023-01-05)与第二行Start Date(2023-01-15)间隔10天,会插入填补该间隔的新行,列值完全符合需求。
内容的提问来源于stack exchange,提问作者Divyank
相关产品推荐
相关产品推荐

