[英]Python & Pandas: series to timedelta
M是数据帧df中的col,表示月份数。
M
1
0
15
我想找到2015-01-01和2015-01-01 + df.M之间的天数。 以下col是我想要的。
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)
大熊猫有没有可以轻松解决这个问题的内置功能?
您可以使用与问题中相同的方法,但使用自动矢量化操作而不是循环。
首先将整数序列转换为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]
如果你想把它作为整数值而不是上面的timedelta,你可以用.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
原因
在这种情况下,你不能使用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
的pandas将使用DateOffset
。 在这种情况下,例如pd.DateOffset(months=1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.