求可计算1995-2019年DataFrame累计天数的Python函数
正确实现累计天数计算的方案
原函数的问题
你的代码逻辑存在几个关键问题:
- 循环计算相邻日期的差值,得到的是单日间隔,并非从1995年1月1日开始的累计天数
- 直接通过
prices['days'][i+1]赋值会触发SettingWithCopyWarning,且循环处理大数据量的DataFrame效率极低 - 未基于起始日做基准计算,完全偏离需求目标
正确实现方式
首先确保days列是datetime类型(如果不是先转换),然后用pandas的矢量化操作直接计算,自动处理闰年:
import pandas as pd def calculate_cumulative_days(prices): # 转换日期列为datetime类型(若尚未转换) prices['days'] = pd.to_datetime(prices['days']) # 定义起始基准日 start_date = pd.to_datetime('1995-01-01') # 计算累计天数:日期差的天数 +1(因为起始日对应第1天) prices['cumulative_days'] = (prices['days'] - start_date).dt.days + 1 return prices
关键说明
- pandas的
Timedelta.dt.days会自动处理闰年的天数统计(比如2000年2月29日会被正确计入天数差) - 矢量化操作比循环快几十到几百倍,适合处理大规模数据
- 用新列
cumulative_days存储结果,避免覆盖原始日期数据(如果需要覆盖原始列,直接替换列名即可)
示例验证
以1995年2月1日为例,计算结果为(pd.to_datetime('1995-02-01') - pd.to_datetime('1995-01-01')).days +1 = 31 +1 =32,完全符合你的示例要求。
内容的提问来源于stack exchange,提问作者Chisom Anene
相关产品推荐
相关产品推荐

