[英]How to extract hours from DataFrame/Series column of timedelta objects?
我的系列s
看起来,看起来像:
0 0 days 09:14:29.142000
1 0 days 00:01:08.060000
2 1 days 00:08:40.192000
3 0 days 17:52:18.782000
4 0 days 01:56:44.696000
dtype: timedelta64[ns]
我在理解如何提取小时数方面遇到困难(四舍五入到最近的小时数)
编辑:
我意识到我可以做类似s[0].hours
事情,这给了我9L
。 因此,我可以执行s[0].hours + 24*s[0].days
,然后使用分钟进行四舍五入。
我如何一次在整个系列中做到这一点?
这就是这里的文档。 这是矢量化的。
In [16]: s
Out[16]:
0 0 days 09:14:29.142000
1 0 days 00:01:08.060000
2 1 days 00:08:40.192000
3 0 days 17:52:18.782000
4 0 days 01:56:44.696000
Name: 0, dtype: timedelta64[ns]
In [17]: s.dt.components
Out[17]:
days hours minutes seconds milliseconds microseconds nanoseconds
0 0 9 14 29 142 0 0
1 0 0 1 8 60 0 0
2 1 0 8 40 192 0 0
3 0 17 52 18 782 0 0
4 0 1 56 44 696 0 0
In [18]: s.dt.components.hours
Out[18]:
0 9
1 0
2 0
3 17
4 1
Name: hours, dtype: int64
如果您不需要实际的小时数属性,那么这是另一种解决方法,但是Timedelta以另一个单位表示(这称为频率转换)
In [31]: s/pd.Timedelta('1h')
Out[31]:
0 9.241428
1 0.018906
2 24.144498
3 17.871884
4 1.945749
dtype: float64
In [32]: np.ceil(s/pd.Timedelta('1h'))
Out[32]:
0 10
1 1
2 25
3 18
4 2
dtype: float64
让我们假设您的时间增量列称为“增量”。 然后,您可以通过以下方式进行操作:
df['rh'] = df.Delta.apply(lambda x: round(pd.Timedelta(x).total_seconds() \
% 86400.0 / 3600.0) )
每个时间增量实际上都是一个numpy.timedelta64
。 它有助于将其转换为具有更便捷方法的熊猫Timedelta
。 在这里,我只要求总秒数,减去86400的任何倍数(即表示整天的数字),然后除以3600(一小时的秒数)。 这为您提供了一个浮点小时数,然后您可以对其进行舍入。
顺便说一句,我假设您只需要在四舍五入的小时中考虑小时,分钟,秒和部分秒的组成部分,而不是整天。 如果您想要包括小时在内的所有小时数,只需省略掉几天的模运算:
df['rh2'] = df.Delta.apply(lambda x: round(pd.Timedelta(x).total_seconds() \
/ 3600.0) )
然后您得到:
也可以直接用numpy术语进行这些计算:
df['rh'] = df.Delta.apply(lambda x: round(x / np.timedelta64(1, 'h')) % 24 )
df['rh2'] = df.Delta.apply(lambda x: round(x / np.timedelta64(1, 'h')) )
其中np.timedelta64(1, 'h')
提供1小时内的纳秒数,并且可选的% 24
舍弃全天分量(如果需要)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.