繁体   English   中英

Python和Pandas:timedelta系列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM