如何在Pandas DataFrame中基于已有数据重新计算datetime类型数据
问题原因
你使用的data["start"][1]属于链式索引操作,Pandas无法确定你操作的是原始DataFrame还是它的临时切片副本,因此会抛出SettingWithCopyWarning警告,即使当前运行结果符合预期,也存在修改不生效到原对象的潜在风险。
修复方案
方案1:向量化计算(推荐)
不需要逐行循环,直接利用累加函数批量计算所有start值,性能更高且完全不会触发警告:
import pandas as pd # 首行start值 + 逐行累计的前序duration之和 data["start"] = data["start"].iloc[0] + data["duration"].shift(fill_value=pd.Timedelta(0)).cumsum()
逻辑说明:shift操作将duration列整体下移一行,首行填充0时长,累加后正好对应每行需要叠加的总时长,加上初始start值就能得到所有行的正确start。
方案2:逐行赋值的正确写法
如果确实需要逐行操作,使用.loc索引替代链式索引即可:
for i in range(1, len(data)): data.loc[i, "start"] = data.loc[i-1, "start"] + data.loc[i-1, "duration"]
额外注意事项
如果你的data本身是从其他DataFrame切片过滤得到的,建议在切片时显式调用.copy()生成独立副本,从根源避免警告:
# 示例:如果data是其他df的切片,加上copy data = original_df[original_df['筛选条件']].copy()
内容的提问来源于stack exchange,提问作者Addm1X
相关产品推荐
相关产品推荐

