Python&;熊猫:时间三角洲系列

Python&;熊猫:时间三角洲系列,python,pandas,Python,Pandas,M是数据帧df中的一个列,表示月份数 M 1 0 15 我正在尝试查找2015-01-01和2015-01-01+df.M之间的天数。下面是我想要的颜色 daynum 31 0 456 我知道如何使用循环和列表: int((datetime.strptime("2015-01-01", "%Y-%m-%d") + relativedelta(months=df.M[i]) - datetime.strptime("2015-01-01", "%Y-%

M是数据帧df中的一个列,表示月份数

M
1
0
15
我正在尝试查找2015-01-01和2015-01-01+df.M之间的天数。下面是我想要的颜色

daynum
31
0
456
我知道如何使用循环和列表:

int((datetime.strptime("2015-01-01", "%Y-%m-%d") + relativedelta(months=df.M[i]) 
                    - datetime.strptime("2015-01-01", "%Y-%m-%d")).days)

pandas中是否有任何内置函数可以轻松解决此问题?

您可以使用与问题中相同的方法,但使用自动矢量化操作而不是循环。
首先将整数系列转换为relativedelta:

In [76]: M = pd.Series([1, 0, 15])

In [77]: M2 = M.apply(lambda x: dateutil.relativedelta.relativedelta(months=x))

In [78]: M2
Out[78]:
0              relativedelta(months=+1)
1                       relativedelta()
2    relativedelta(years=+1, months=+3)
dtype: object
然后您可以执行相同的计算:

In [80]: (pd.Timestamp('2015-01-01') + M2) - pd.Timestamp('2015-01-01')
Out[80]:
0    31 days
1     0 days
2   456 days
dtype: timedelta64[ns]
如果您想将其作为整数值而不是上面提到的时间增量,您可以使用
.dt.days

In [81]: days = (pd.Timestamp('2015-01-01') + M2) - pd.Timestamp('2015-01-01')

In [82]: days.dt.days
Out[82]:
0     31
1      0
2    456
dtype: int64

不使用时间增量的原因

在这种情况下,您不能使用timedelta,因为这并不能准确地将日期移动一定数量的月份,但它似乎给您提供了某种类型的平均月长:

In [83]: pd.to_timedelta(1, unit='M')
Out[83]: Timedelta('30 days 10:29:06')

In [84]: (pd.Timestamp('2015-01-01') + pd.to_timedelta(M, unit='M')) - pd.Timestamp('2015-01-01')
Out[84]:
0    30 days 10:29:06
1     0 days 00:00:00
2   456 days 13:16:30
dtype: timedelta64[ns]
所以这会给出稍微不同的答案。例如,在本例中,第一个元素的时间是30天,而不是31天


相当于
relativedelta
的方法是使用
DateOffset
。在这种情况下,例如,
pd.DateOffset(months=1)

对不起,您是否试图在
2015-01-01
中添加月或日?例如,这是您想要的:
在[41]:pd.to_datetime('2015-01-01')+pd.TimedeltaIndex(df['M',unit='M')Out[41]:DatetimeIndex中(['2015-01-31 10:29:06','2015-01-01 00:00:00','2016-04-01 13:16:30',dtype='datetime64[ns]',freq=None)
?Thx!TimedeltaIndex是我要找的!请看我的答案,Timedelta不会给出准确的答案是的,我认为这是正确的方法,因为它不会处理您指出的第一行+1