2017-07-18 38 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

相关问题