如何在Pandas中为日期/时间序列添加对应天数序列?
解决Pandas中Datetime序列与天数序列对应相加的问题
我懂你试了好几种方法都碰壁的郁闷——Pandas对datetime类型的运算确实有严格的类型要求,直接和数值序列相加肯定会踩坑。核心问题是:你得把数值形式的天数转换成Pandas能识别的时间差(timedelta)类型,这样才能和datetime序列做对应元素的加法。
下面是两种最靠谱的解决方案:
方法1:使用pd.to_timedelta(推荐,效率最高)
这是最简洁且高效的方式,直接把天数序列转换成timedelta类型,指定单位为天(unit='D'),之后就能和datetime序列直接相加了:
import pandas as pd import numpy as np # 你的原始数据 dates = pd.Series(pd.date_range("20180101 00:00", "20180104 00:00")) days = pd.Series(np.arange(4)).astype('float') # 核心操作:转换天数为timedelta,再相加 result = dates + pd.to_timedelta(days, unit='D') print(result)
输出结果:
0 2018-01-01 1 2018-01-03 2 2018-01-05 3 2018-01-07 dtype: datetime64[ns]
方法2:逐元素应用pd.DateOffset(适合小数据集)
如果你需要更灵活的时间偏移(比如同时加天、小时),可以用逐元素处理的方式,但注意这种方法在大数据量下效率不如第一种:
# 用列表推导式逐元素相加 result = pd.Series([dates[i] + pd.DateOffset(days=days[i]) for i in range(len(dates))])
为什么你之前的方法会报错?
我来帮你拆解下那些尝试的问题:
dates + days:Pandas无法判断数值days代表的是天、小时还是分钟,必须明确是timedelta类型才允许运算。dates + days.astype('int'):就算转成整数,依然是数值类型,不是时间差类型,类型不兼容。dates + pd.DateOffset(days=days):pd.DateOffset的days参数只能接受单个数值,不能直接传入Series,所以无法批量处理。dates + np.timedelta64(days.values):np.timedelta64需要的是单个值或统一格式的时间差数组,直接传Series的values格式不对,正确写法应该是np.array(days.values, dtype='timedelta64[D]'),但还是不如pd.to_timedelta方便。dates + pd.offsets.Day(days):和pd.DateOffset一样,pd.offsets.Day只能接受单个数值,不支持Series。dates + pd.datetools.timedelta(days=days):pd.datetools已经被Pandas弃用了,而且timedelta的days参数也不能是Series。
内容的提问来源于stack exchange,提问作者joshlk
相关产品推荐
相关产品推荐

