Невозможно преобразовать столбец в дату и время - PullRequest
0 голосов
/ 04 мая 2019

Я перепробовал много предложений, но ни одно из них не было решено.У меня есть два столбца с такими наблюдениями: 15: 08: 19

Если я напишу

df.time_entry.describe() 

, это будет выглядеть так:

count       814262
unique       56765
top       15:03:00
freq           103
Name: time_entry, dtype: object

Я уже запустил этокод:

df['time_entry'] = pd.to_datetime(df['time_entry'],format= '%H:%M:%S', errors='ignore' ).dt.time

Но при повторном запуске описанного кода все равно возвращается dtype: object.

Ответы [ 2 ]

1 голос
/ 05 мая 2019

Какова цель dt.time?

Просто удалите dt.time, и ваше преобразование из объекта в datetime будет работать отлично.

df['time_entry'] = pd.to_datetime(df['time_entry'],format= '%H:%M:%S')
0 голосов
/ 05 мая 2019

Проблема в том, что вы используете аксессор datetime (.dt) со свойством time, и тогда вы не можете вычесть эти два столбца друг из друга.Итак, просто опустите .dt.time, и оно должно работать.

Вот некоторые данные с 2 столбцами строк

df = pd.DataFrame()
df['time_entry'] = ['12:01:00', '15:03:00', '16:43:00', '14:11:00']
df['time_entry2'] = ['13:03:00', '14:04:00', '19:23:00', '18:12:00']

print(df)
  time_entry time_entry2
0   12:01:00    13:03:00
1   15:03:00    14:04:00
2   16:43:00    19:23:00
3   14:11:00    18:12:00

Преобразование обоих столбцов в datetime dtype

df['time_entry'] = pd.to_datetime(df['time_entry'], format= '%H:%M:%S', errors='ignore')
df['time_entry2'] = pd.to_datetime(df['time_entry2'], format= '%H:%M:%S', errors='ignore')

print(df)
           time_entry         time_entry2
0 1900-01-01 12:01:00 1900-01-01 13:03:00
1 1900-01-01 15:03:00 1900-01-01 14:04:00
2 1900-01-01 16:43:00 1900-01-01 19:23:00
3 1900-01-01 14:11:00 1900-01-01 18:12:00

print(df.dtypes)
time_entry     datetime64[ns]
time_entry2    datetime64[ns]
dtype: object

(Необязательно) Укажите часовой пояс

df['time_entry'] = df['time_entry'].dt.tz_localize('US/Central')
df['time_entry2'] = df['time_entry2'].dt.tz_localize('US/Central')

Теперь выполните разницу во времени (вычитание) между двумя столбцами и получите разницу во времени в количестве дней (в виде числа с плавающей запятой)

df['Diff_days1'] = (df['time_entry'] - df['time_entry2']).dt.total_seconds()/60/60/24
df['Diff_days2'] = (df['time_entry'] - df['time_entry2']) / np.timedelta64(1, 'D')
df['Diff_days3'] = (df['time_entry'].sub(df['time_entry2'])).dt.total_seconds()/60/60/24

print(df)
           time_entry         time_entry2  Diff_days1  Diff_days2  Diff_days3
0 1900-01-01 12:01:00 1900-01-01 13:03:00   -0.043056   -0.043056   -0.043056
1 1900-01-01 15:03:00 1900-01-01 14:04:00    0.040972    0.040972    0.040972
2 1900-01-01 16:43:00 1900-01-01 19:23:00   -0.111111   -0.111111   -0.111111
3 1900-01-01 14:11:00 1900-01-01 18:12:00   -0.167361   -0.167361   -0.167361

РЕДАКТИРОВАТЬ

Если вы пытаетесь получить доступ к атрибутам datetime, то вы можете сделать это с помощьюиспользуя столбец time_entry напрямую (не столбец разницы во времени).Вот пример

df['day1'] = df['time_entry'].dt.day
df['time1'] = df['time_entry'].dt.time
df['minute1'] = df['time_entry'].dt.minute
df['dayofweek1'] = df['time_entry'].dt.weekday
df['day2'] = df['time_entry2'].dt.day
df['time2'] = df['time_entry2'].dt.time
df['minute2'] = df['time_entry2'].dt.minute
df['dayofweek2'] = df['time_entry2'].dt.weekday

print(df[['day1', 'time1', 'minute1', 'dayofweek1',
        'day2', 'time2', 'minute2', 'dayofweek2']])
   day1     time1  minute1  dayofweek1  day2     time2  minute2  dayofweek2
0     1  12:01:00        1           0     1  13:03:00        3           0
1     1  15:03:00        3           0     1  14:04:00        4           0
2     1  16:43:00       43           0     1  19:23:00       23           0
3     1  14:11:00       11           0     1  18:12:00       12           0
...