【问题标题】:convert float to hours and minutes in pandas/numpy在 pandas/numpy 中将浮点数转换为小时和分钟
【发布时间】:2017-12-23 19:17:43
【问题描述】:

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

我试过了:

# 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 的结果

【问题讨论】:

    标签: python pandas datetime numpy


    【解决方案1】:

    您将要在函数中使用 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]
    

    【讨论】:

    【解决方案2】:

    我很确定应该有一个更有效的解决方案,但由于还没有人回答,这里有一个 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
    

    【讨论】:

    • 你打败了我,但有一件事 - 你应该使用 ('%.2f' % number).split(sep='.') 来允许 4.5 映射到 4:50 :)
    • @Kevin 当我这样做时,我得到了长格式输出。例如: ' 0 1900-01-01 04:50:00
    • @Andrew您可以将它们转换为仅显示时间,但类型不会是日期时间,而是对象,让我编辑我的答案。
    • @ViníciusAguiar 我还能执行加法和减法吗,例如 0.34 + .33 = 1.07(或 :34 + :33 = 1:07)?
    • @Andrew 我不习惯这种操作,所以我不能肯定地回答你,对不起,但恐怕不是那么容易,时间戳添加总是很棘手,你会必须使用 timedelta,您可以在此处阅读有关此内容的更多信息:stackoverflow.com/questions/12448592/…“我仍然可以 (...)” - 您甚至无法在第一次转换时进行类似的添加,因为正如我所说,这很棘手。
    猜你喜欢
    • 1970-01-01
    • 2021-08-18
    • 2019-02-22
    • 2015-07-20
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2012-01-23
    相关资源
    最近更新 更多