У меня есть временные данные, которые мне нужно преобразовать в правильное datetime с помощью
data['dep_time'] = pd.to_datetime(data['dep_time'], format='%H:%M').dt.time
Проблема в том, что в каждой ячейке у меня непоследовательное количество цифр
У меня могло быть «1714», «714» или просто «6».
Я хочу использовать формат для изменения каждой строки в формате 00:00, но мне нужно начать с конца строки и предположить, что если у меня просто '6', это означает '00: 06'
year month day dep_time dep_delay arr_time arr_delay cancelled \
103992 2014 5 11 1013 -2 1247 -13 0
103993 2014 5 11 1929 -1 2215 -24 0
103994 2014 5 11 1117 5 1355 9 0
103995 2014 5 11 736 -10 924 -18 0
103996 2014 5 11 1340 0 1647 10 0
Это будет 01:11
Тогда как форматируется 11:01?
Просто так. Мои данные говорят 1101, когда это означает это, и я делаю некоторые предположения о согласованности того, что у меня есть.






В простом Python вы можете использовать правильное обоснование:
for s in ('1', '12', '123', '1234'):
print(s.rjust(4, '0'))
выход
0001
0012
0123
1234
Я пытаюсь не выполнять цикл for для каждой ячейки в моих данных - форматирование быстрее?
@ Davtho1983 с пандами делаешь df[column].str.rjust(4, '0')
Попробуйте использовать str.pad
df=pd.DataFrame({'time':['1', '12', '123', '1234']})
df.time.str.pad(4,side='left',fillchar='0')
Out[188]:
0 0001
1 0012
2 0123
3 1234
Name: time, dtype: object
Или rjust
df.time.str.rjust(4,fillchar='0')
Out[190]:
0 0001
1 0012
2 0123
3 1234
Name: time, dtype: object
Обновлять
pd.to_datetime(df.time.str.pad(4,side='left',fillchar='0'),format='%H%M').dt.time
Out[199]:
0 00:01:00
1 00:12:00
2 01:23:00
3 12:34:00
Name: time, dtype: object
Есть идеи, почему этот data ['dep_time'] = pd.to_datetime (data ['dep_time'], format = '% H:% M'). Dt.time сейчас не передает его в datetime?
Добавлены данные в вопрос. Ошибка, которую я получаю: ValueError: данные времени '24: 00 'не соответствуют формату'% H:% M '(совпадение)'
Мне нужно преобразовать столбец в отдельный df, чтобы это работало? Кажется, это не работает только с столбцом, потому что это объект Series: объект 'Series' не имеет атрибута 'time' - поэтому я делаю data ['dep_time'] = pd.to_datetime (data ['dep_time'] .time.str.pad (4, side = 'left', f illchar = '0'), format = '% H% M'). dt.time
@ Davtho1983 вы добавляете дополнительный time здесь попробуйте pd.to_datetime(data['dep_time'].str.pad(4,side='left',fillchar='0'),format='%H%M').dt.time
Это дает мне ValueError: остаются непреобразованные данные: 0 - не уверен, что это значит!
@ Davtho1983 ЧЧММ ... подумайте о часах, они должны быть от 00 до 24, а минуты должны быть от 00 до 60, у вас есть какое-то значение, превышающее диапазон
@ Davtho1983 добавляет errors , ошибка останется как NaT pd.to_datetime(data['dep_time'].str.pad(4,side='left',fillchar='0'),format='%H%M',errors='coerce').dt.time
Есть ли способ узнать, какая строка вызывает ошибку?
Не так элегантно, как некоторые предложения, но просто и может сработать для вас?
dt = 'dep_time'.zfill(4)
dt = dt[:2] + ":" + dt[2:]
Итак, за 1 вы получите
00:01
и для 613:
06:13
или более кратко:
dt = '{0}:{1}'.format(date_time.zfill(4)[:2], date_time.zfill(4)[2:])
Заимствование df Вэня
pandas.Series.str.zfilldf.time.str.zfill(4)
0 0001
1 0012
2 0123
3 1234
Name: time, dtype: object
[f'{int(i):04d}' for i in df.time]
['0001', '0012', '0123', '1234']
Что делать, если ячейка
'111'?