代码之家  ›  专栏  ›  技术社区  ›  Davtho1983

使用pandas将ints转换为timedelta

  •  2
  • Davtho1983  · 技术社区  · 8 年前

    我在pandas df中有一些值是正整数和负整数,我想将它们转换为TimeDelta,以便将它们放入Django模型中的DurationField中。

                 date  dep_time dep_delay  arr_time arr_delay cancelled carrier  \
    103992 2014-05-11  10:13:00        -2  12:47:00       -13         0      B6   
    103993 2014-05-11  19:29:00        -1  22:15:00       -24         0      B6   
    103994 2014-05-11  11:17:00         5  13:55:00         9         0      B6   
    103995 2014-05-11  07:36:00       -10  09:24:00       -18         0      B6   
    103996 2014-05-11  13:40:00         0  16:47:00        10         0      B6   
    
           tailnum flight origin dest air_time distance duration  
    103992  N630JB    925    JFK  TPA      137     1005     1013  
    103993  N632JB    225    JFK  TPA      137     1005     1929  
    103994  N635JB    127    EWR  MCO      126      937     1117  
    103995  N637JB   1273    JFK  CHS       92      636     0736  
    103996  N637JB    213    JFK  LGB      352     2465     1340  
    

    有了这些数据,我想将dep\u delay、arr\u delay、air\u time和duration表示为timedelta,但我总是得到零值?我正在使用

    data['air_time'] = pd.to_timedelta(data['air_time'], errors='coerce')
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   unutbu    8 年前

    如果你得到了所有 00:00:00.000000 价值观,然后 air_time 值可能是字符串。(您可以检查 air\u时间 检查列 data.info() 。如果数据类型显示 object 然后这些值是Python对象(例如 str s) 而不是NumPy integer数据类型。然后可以通过检查来确认它们是字符串 set(map(type, data['air_time'])) .)

    如果它们是字符串,可以先使用以下命令将它们转换为int:

    data['air_time'] = data['air_time'].astype(int)
    

    如果137表示137分钟,则使用

    data['air_time'] = pd.to_timedelta(data['air_time'], unit='m', errors='coerce')
    

    另一方面,如果137表示1小时37分钟,则使用

    data['air_time'] = pd.to_timedelta(
        (data['air_time']//100)*60 + (data['air_time'] % 100), unit='m', 
        errors='coerce')
    

    这个 unit='m' argument 说明 pd.to_timedelta 将值解释为分钟。

    例如

    import pandas as pd
    
    data = pd.DataFrame({'air_time':['137','137','126','92','352']})
    data['air_time'] = data['air_time'].astype(int)
    data['air_time'] = pd.to_timedelta(data['air_time'], unit='m', errors='coerce')
    

    收益率

      air_time
    0 02:17:00
    1 02:17:00
    2 02:06:00
    3 01:32:00
    4 05:52:00
    

    请注意 pd。至\u timedelta 也可以接受字符串作为输入 如果字符串包含所需的单位 例如

    import pandas as pd
    
    data = pd.DataFrame({'air_time':['137','137','126','92','352']})
    data['air_time'] = data['air_time'] + ' minutes'
    #       air_time
    # 0  137 minutes
    # 1  137 minutes
    # 2  126 minutes
    # 3   92 minutes
    # 4  352 minutes
    
    data['air_time'] = pd.to_timedelta(data['air_time'], errors='coerce')
    

    产生相同的结果。