Преобразование строковых дат, которые не могут быть дополнены нулями - PullRequest
0 голосов
/ 18 мая 2018

Я получаю свои данные и некоторые даты из нетрадиционного источника, и из-за этого есть небольшие различия в строковых датах.большая разница в том, что есть даты, смешанные в тех случаях, когда день не дополняется нулем, после дня может быть пробел (в случае даты 2/9/2018), а также месяцы не дополняются нулями.Я получаю сообщение об ошибке, что «данные о времени не соответствуют формату«% m% d% Y »при попытке datetime.strptime. Как я могу преобразовать столбец дат, где есть небольшие различия, как это? См. Код и примеры данныхниже

d_o = datetime.datetime.strptime(df['start'][1], '%m %d %Y')
  • 1/26/2018
  • 1/26/2018
  • 2/2/2018
  • 2/2 /2018
  • 2/9/2018
  • 2/9/2018
  • 1/19/2018
  • 1/19/2018
  • 1/26/2018
  • 1/26/2018
  • 2/2/2018
  • 2/2/2018
  • 2/9/2018

Ответы [ 2 ]

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

Вы можете использовать re.split и str.zfill:

import re
dates = ['1/26/2018', '1/26/2018', '2/2/2018', '2/2/2018', '2/9 /2018', '2/9 /2018', '1/19/2018', '1/19/2018', '1/26/2018', '1/26/2018', '2/2/2018', '2/2/2018', '2/9 /2018']
new_dates = ['{}/{}/{}'.format(a.zfill(2), *b) for a, *b in map(lambda x:re.split('[/\s]+', x), dates)]

Выход:

['01/26/2018', '01/26/2018', '02/2/2018', '02/2/2018', '02/9/2018', '02/9/2018', '01/19/2018', '01/19/2018', '01/26/2018', '01/26/2018', '02/2/2018', '02/2/2018', '02/9/2018']
0 голосов
/ 18 мая 2018

Вы должны использовать стороннюю библиотеку, такую ​​как dateutil.Эта библиотека принимает широкий спектр форматов даты за счет производительности.

from dateutil import parser

lst = ['1/26/2018', '1/26/2018', '2/2/2018', '2/2/2018', '2/9 /2018', '2/9 /2018',
       '1/19/2018', '1/19/2018', '1/26/2018', '1/26/2018', '2/2/2018', '2/2/2018',
       '2/9 /2018']

res = [parser.parse(i) for i in lst]

Результат:

[datetime.datetime(2018, 1, 26, 0, 0),
 datetime.datetime(2018, 1, 26, 0, 0),
 datetime.datetime(2018, 2, 2, 0, 0),
 datetime.datetime(2018, 2, 2, 0, 0),
 datetime.datetime(2018, 2, 9, 0, 0),
 datetime.datetime(2018, 2, 9, 0, 0),
 datetime.datetime(2018, 1, 19, 0, 0),
 datetime.datetime(2018, 1, 19, 0, 0),
 datetime.datetime(2018, 1, 26, 0, 0),
 datetime.datetime(2018, 1, 26, 0, 0),
 datetime.datetime(2018, 2, 2, 0, 0),
 datetime.datetime(2018, 2, 2, 0, 0),
 datetime.datetime(2018, 2, 9, 0, 0)]
...