Преобразование целых в timedelta с пандами - PullRequest
0 голосов
/ 04 мая 2018

У меня есть некоторые значения в pandas df, которые являются положительными и отрицательными целочисленными значениями, и я хочу преобразовать их в timedeltas, чтобы я мог поместить их в DurationField в модели Django.

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

1 Ответ

0 голосов
/ 04 мая 2018

Если вы получаете все 00:00:00.000000 значения, тогда ваши air_time значения могут быть строками. (Вы можете проверить тип данных столбца air_time, проверив data.info(). Если dtype сообщает object, тогда значения являются объектами Python (такими как str s) вместо целочисленного типа данных 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 также может принимать строки в качестве входных данных , если строки содержат требуемые единицы . Например,

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

дает тот же результат.

...