Преобразование строки в дату и время, когда строка не соответствует указанному формату даты c - PullRequest
0 голосов
/ 05 августа 2020

У меня возникли проблемы с преобразованием следующей строки в объект datetime с помощью Python. У меня есть большой файл csv (более 10 тыс. Строк), и мне нужно преобразовать столбец дат из следующего формата:

Jun 1, 2020 12:11:49 AM PDT

в:

06/01/20

Моя первая мысль была используйте datetime.strptime, который требует передачи строки и формата даты, в котором она находится, потому что тогда я могу просто переформатировать один тип даты в другой очень легко. Проблема, с которой я столкнулся, заключается в том, что я не знаю, как представить эту строку как формат даты, в основном из-за часового пояса.

Лучшее предположение о формате даты, который мне нужен, - это '% mmm% dd, % yyyy% H:% M:% S% aa ', но я не могу понять, как представить здесь часовой пояс (и я также не уверен, что AM / PM будут% aa).

I Я пробовал искать другие потоки, но все они, кажется, имеют легко сопоставимые строки.

Спасибо!

Ответы [ 3 ]

1 голос
/ 05 августа 2020

Формат задокументирован в следующей таблице, в частности, AM / PM - это %p, а часовой пояс - %Z:

https://docs.python.org/3/library/datetime.html#strftime -and-strptime-format-codes

Однако в вашем случае я бы посоветовал вообще не беспокоиться о синтаксическом анализе, а полагаться на dateutil для выполнения синтаксического анализа. Он более гибкий, так как почти всегда может определить правильный формат.

0 голосов
/ 06 августа 2020

Как уже предлагал @adrtam, вы можете использовать синтаксический анализатор dateutil для удобного анализа такой строки. чтобы правильно проанализировать часовой пояс, вы можете предоставить ему сопоставление dict:

from dateutil import parser, tz

s = 'Jun 1, 2020 12:11:49 AM PDT'

tzmapping = {'PDT': tz.gettz('US/Pacific')} # assuming PDT means Pacific daylight saving time

dt = parser.parse(s, tzinfos=tzmapping)

dt
Out[2]: datetime.datetime(2020, 6, 1, 0, 11, 49, tzinfo=tzfile('US/Pacific'))

Теперь вы можете легко форматировать в строку:

s_reformatted = dt.strftime('%m/%d/%y')

s_reformatted
Out[4]: '06/01/20'
0 голосов
/ 05 августа 2020

Я бы отлично вырезал время и часовой пояс

Тогда у вас есть много вариантов. Как уже упоминалось, dateutil круто и отлично работает. Но если вы по какой-то причине хотели остаться в datetime, вы могли бы:

  • Анализировать все, но знайте, что часовой пояс игнорируется

Datetime / strptime может анализировать все, но не понимает / не конвертирует часовые пояса. Если вы сделаете это, он просто проанализирует его как UT C.

>>> str(datetime.strptime("Jun 1, 2020 12:11:49 AM PDT", "%b %d, %Y %I:%M:%S %p %Z"))
'2020-06-01 00:11:49'

Вы также можете выбросить временную часть, прежде чем передать ее в strptime (), но это, вероятно, больше проблем, чем стоит того другие варианты.

Упс. Я не понимал, что% Z будет анализировать только определенные часовые пояса (которые, вероятно, зависят от вашей машины). Так что, если вы не можете это контролировать, это не сработает. На моей машине «PDT» будет анализировать, а «EDT» не сработает.

Учитывая это, я бы выбросил часовой пояс. Если он всегда в этом формате, то может быть что-то вроде:

>>> ts = "Jun 1, 2020 12:11:49 AM PDT"
>>> str(datetime.strptime(ts.rpartition(" ")[0], "%b %d, %Y %I:%M:%S %p"))
'2020-06-01 00:11:49'
...