Python&;熊猫:时间三角洲系列
M是数据帧df中的一个列,表示月份数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
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