2017-07-18 59 views
2

我在pd.DataFrame中有幾個小數點分隔小時和分鐘(例如3.15 = 3小時15分鐘)的列。有沒有一種快速的方法來轉換,以便數據被識別爲h.m?熊貓時間系列文檔似乎不適用於我的情況。我沒有或不想附上任何日期。將浮點數轉換爲熊貓/ numpy中的小時和分鐘

我嘗試:

# create df 
hour_min = pd.DataFrame({'a': [4.5, 2.3, 3.17], 
      'b': [2.12, 1.13, 9.13], 
      'c': [8.23, 9.14, 7.45]}) 
# convert to hours 
hour_min.astype('timedelta64[h]') 

其給出

  a  b  c 
0 04:00:00 02:00:00 08:00:00 
1 02:00:00 01:00:00 09:00:00 
2 03:00:00 09:00:00 07:00:00 

但我想

a  b  c 
0 04:50 02:12 08:23 
1 02:30 01:13 09:14 
2 03:17 09:13 07:45 

我還需要以下類型的結果的從加/減列的值1.32 + 1.32 = 3.04

回答

2

你會想在一個函數的使用pd.to_timedelta n和applymap它得到你想要的數學。看起來是這樣的:

import pandas as pd 
import math 


def to_t_delt(number): 
    return pd.to_timedelta(f'{math.floor(number)}hours {(number - math.floor(number)) * 100}min') 


hour_min = pd.DataFrame({'a': [4.5, 2.3, 3.17], 
         'b': [2.12, 1.13, 9.13], 
         'c': [8.23, 9.14, 7.45]}) 

hour_min = hour_min.applymap(to_t_delt) 
print(hour_min) 
print() 
print(hour_min['a'] + hour_min['b']) 

,併產生這樣的結果:

  a  b  c 
0 04:50:00 02:12:00 08:23:00 
1 02:30:00 01:13:00 09:14:00 
2 03:17:00 09:13:00 07:45:00 

0 07:02:00 
1 03:43:00 
2 12:30:00 
dtype: timedelta64[ns] 
+0

[Time Deltas Usage](https://pandas.pydata.org/pandas-docs/stable/timedeltas.html)和[pandas.to_timedelta](https://pandas.pydata.org/pandas-docs/stable/ generated/pandas.to_timedelta.html)來自文檔 –

+0

的API看起來不錯。我無法接受來自應用程序的回答。將在早上從個人電腦做。謝謝 – Andrew

4

我敢肯定應該有一個更有效的解決方案,但由於沒有人回答的是,這裏是一個哈克解決方法:

import pandas as pd 

hour_min = pd.DataFrame({'a': [4.5, 2.3, 3.17], 
      'b': [2.12, 1.13, 9.13], 
      'c': [8.23, 9.14, 7.45]}) 

def convert(number): 
    hour = ('%.2f' % number).split(sep='.')[0] 
    minute = ('%.2f' % number).split(sep='.')[1] 
    return pd.to_datetime(hour+":"+minute, format='%H:%M') 

然後你只需要使用applymap()

>>> hour_min = hour_min.applymap(convert) 
>>> hour_min 
        a     b     c 
0 1900-01-01 04:50:00 1900-01-01 02:12:00 1900-01-01 08:23:00 
1 1900-01-01 02:30:00 1900-01-01 01:13:00 1900-01-01 09:14:00 
2 1900-01-01 03:17:00 1900-01-01 09:13:00 1900-01-01 07:45:00 

您可以只顯示與時間:

>>> for i in hour_min: 
    hour_min[i] = hour_min[i].dt.time  

>>> hour_min 
      a   b   c 
0 04:50:00 02:12:00 08:23:00 
1 02:30:00 01:13:00 09:14:00 
2 03:17:00 09:13:00 07:45:00 
+1

你打我一記重拳,但有一兩件事 - 你應該使用'(%號 '.2f%')。 split(sep ='。')'而不是讓4.5映射到4:50 :) – Kevin

+0

@Kevin完美!謝謝! –

+0

@Kevin當我這樣做時,我得到了長格式輸出。例如: 'a 0 1900-01-01 04:50:00 – Andrew

相關問題