首页 > 解决方案 > 使用 pandas 将整数转换为 timedelta

问题描述

我在 pandas df 中有一些值是正整数和负整数,我想将它们转换为 timedeltas,以便我可以将它们放入 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_delay、arr_delay、air_time 和 duration 表示为 timedeltas,但我不断得到零值?我在用着

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

标签: pythonpandastimedelta

解决方案


如果您获得所有00:00:00.000000值,那么您的air_time值可能是字符串。(您可以air_time通过检查来检查列的数据类型data.info()。如果 dtype显示,object则这些值是 Python 对象(例如strs)而不是 NumPy 整数数据类型。然后您可以通过检查来确认它们是字符串set(map(type, data['air_time']))。)

如果它们是字符串,您可以先使用以下方法将它们转换为整数:

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'参数告诉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.to_timedelta, can 也接受字符串作为输入。例如,

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')

产生相同的结果。


推荐阅读