Форматировать time str с нарезкой

У меня есть временные данные, которые мне нужно преобразовать в правильное 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   

Что делать, если ячейка '111'?

Alex Hall 03.05.2018 21:13

Это будет 01:11

Davtho1983 03.05.2018 21:14

Тогда как форматируется 11:01?

Alex Hall 03.05.2018 21:15

Просто так. Мои данные говорят 1101, когда это означает это, и я делаю некоторые предположения о согласованности того, что у меня есть.

Davtho1983 03.05.2018 21:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
82
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

В простом Python вы можете использовать правильное обоснование:

for s in ('1', '12', '123', '1234'):
    print(s.rjust(4, '0'))

выход

0001
0012
0123
1234

Я пытаюсь не выполнять цикл for для каждой ячейки в моих данных - форматирование быстрее?

Davtho1983 03.05.2018 21:18

@ Davtho1983 с пандами делаешь df[column].str.rjust(4, '0')

cs95 03.05.2018 21:21
Ответ принят как подходящий

Попробуйте использовать 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?

Davtho1983 03.05.2018 21:31

Добавлены данные в вопрос. Ошибка, которую я получаю: ValueError: данные времени '24: 00 'не соответствуют формату'% H:% M '(совпадение)'

Davtho1983 03.05.2018 21:49

Мне нужно преобразовать столбец в отдельный 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 03.05.2018 21:59

@ Davtho1983 вы добавляете дополнительный time здесь попробуйте pd.to_datetime(data['dep_time'].str.pad(4,side='left',fillch‌​ar='0'),format='%H%M‌​').dt.time

BENY 03.05.2018 22:01

Это дает мне ValueError: остаются непреобразованные данные: 0 - не уверен, что это значит!

Davtho1983 03.05.2018 22:04

@ Davtho1983 ЧЧММ ... подумайте о часах, они должны быть от 00 до 24, а минуты должны быть от 00 до 60, у вас есть какое-то значение, превышающее диапазон

BENY 03.05.2018 22:07

@ Davtho1983 добавляет errors , ошибка останется как NaT pd.to_datetime(data['dep_time'].str.pad(4,side='left',fillch‌​ar='0'),format='%H%M‌​',errors='coerce').d‌​t.time

BENY 03.05.2018 22:09

Есть ли способ узнать, какая строка вызывает ошибку?

Davtho1983 03.05.2018 22:11

Не так элегантно, как некоторые предложения, но просто и может сработать для вас?

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.zfill

df.time.str.zfill(4)

0    0001
1    0012
2    0123
3    1234
Name: time, dtype: object

Python 3.6 f-строка

[f'{int(i):04d}' for i in df.time]

['0001', '0012', '0123', '1234']

Другие вопросы по теме