在pandas / numpy中将float转换为小时和分钟

时间:2017-07-18 18:56:35

标签: python pandas datetime numpy

我在pd.DataFrame中有几列,其中decimal包括小时和分钟(例如,3.15 = 3小时,15分钟)。是否有一种快速的方法来转换它,以便将数据识别为h.m?大熊猫时间序列文档似乎不适用于我的情况。我没有或想要附上任何日期。

我试过了:

ServiceStackHost.Instance

给出了

# 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

我还需要以下类型的结果来添加/减去列值1.32 + 1.32 = 3.04

2 个答案:

答案 0 :(得分:4)

我非常确定应该有一个更有效的解决方案,但由于还没有人回答,这里有一个 hacky 解决方法:

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 :(得分:2)

您希望在函数中使用pd.to_timedelta并在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]