簡體   English   中英

如何從timedelta對象的DataFrame / Series列中提取小時?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM