如何从timedelta对象的DataFrame / Series列中提取小时数?

时间:2015-03-26 18:25:08

标签: python pandas dataframe python-datetime

我的系列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然后使用会议记录进行相应的轮询。

如何在整个系列中同时执行此操作?

2 个答案:

答案 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(一小时内的秒数)。这会给你一个浮点数小时,然后你可以将其舍入。

dataframe after update

我认为,顺便说一下,您只想要在舍入时间内考虑的小时,分​​钟,秒和部分秒组件,而不是整天。如果您希望所有小时数,包括天数,只需省略减少日期的模数操作:

df['rh2'] = df.Delta.apply(lambda x: round(pd.Timedelta(x).total_seconds() \
                           / 3600.0) )

然后你得到:

alternate update

也可以直接用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会占用全天组件(如果需要)。