我的系列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
然后使用会议记录进行相应的轮询。
如何在整个系列中同时执行此操作?
答案 0 :(得分:3)
这是正确的文档here。这是矢量化的。
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
答案 1 :(得分:0)
让我们假设您的时间delta列称为" Delta"。然后你就可以这样做:
df['rh'] = df.Delta.apply(lambda x: round(pd.Timedelta(x).total_seconds() \
% 86400.0 / 3600.0) )
每次delta都是numpy.timedelta64
。它有助于将其转换为具有更方便方法的pandas 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
会占用全天组件(如果需要)。