Более быстрый способ создания столбца даты и времени из существующих столбцов даты и времени в Pandas Dataframe - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть Pandas Dataframe со столбцами Year, Month, Day и Time, и я пытаюсь объединить их в новый столбец, в котором только один объект datetime. Тип данных в каждом столбце - это int, включая столбец времени (от 1 до 2359). Например: 2015, 3, 15, 745 будет 15 марта 2015 года в 7:45 утра.

В настоящее время я просто делаю это, но на моем фрейме данных, который имеет 58000 строк, уходит несколько минут:

for i in range(len(flights.index)):
    flights['SCHEDULED_DEPARTURE_DATETIME'][i] = datetime.datetime(
        flights.iloc[i]['YEAR'], 
        flights.iloc[i]['MONTH'], 
        flights.iloc[i]['DAY'], 
        int(np.floor(flights.iloc[i]['SCHEDULED_DEPARTURE']/100)), #hours
        flights.iloc[i]['SCHEDULED_DEPARTURE']%100                 #minutes
    ) 

Должен быть более быстрый, более питонский способ сделать это, но я не могу заставить его работать с apply. Чего мне не хватает?

К вашему сведению, мой фрейм данных представляет собой небольшое подмножество этого набора данных из Kaggle: https://www.kaggle.com/usdot/flight-delays#flights.csv

1 Ответ

0 голосов
/ 05 ноября 2018

Вы можете использовать pd.to_datetime() так:

import pandas as pd
import numpy as np

data = pd.DataFrame(np.array(
    [
        [2018, 10, 1, 2359],
        [2018, 10, 1, 1500],
        [2018, 10, 1, 900],
        [2018, 10, 1, 1],
        [2018, 10, 1, 0]
    ]
), columns = ['year', 'month', 'day', 'scheduled_departure'])

data['hour'] = np.floor(data['scheduled_departure'] / 100)

data['minute'] = data['scheduled_departure'] % 100

data['scheduled_departure_datetime'] = pd.to_datetime(data[['year', 'month', 'day', 'hour', 'minute']])

print(data['scheduled_departure_datetime'])

Предоставление:

0   2018-10-01 23:59:00
1   2018-10-01 15:00:00
2   2018-10-01 09:00:00
3   2018-10-01 00:01:00
4   2018-10-01 00:00:00
Name: scheduled_departure_datetime, dtype: datetime64[ns]

Я не проверял скорость, но думаю, что это будет быстрее.

...