Преобразование String в объекты Datetime с различными форматами python

Итак, я работаю с фреймом данных с датами, хранящимися в виде строк в разных форматах (почему люди это делают??), и мне нужно превратить их в объекты даты и времени. Дело в том, что они не только в разных форматах, но и на разных языках. Я думаю, что единственный способ приблизиться к этому — использовать Regex, который соответствует каждому конкретному формату, а затем передать его в качестве аргумента функции pd.to_datetime, но я просто не мог заставить регулярное выражение соответствовать какой-либо строке. Я думаю, что Regex не работает с объектами даты и времени, такими как %d, %b, %Y, etc. (Я пробовал с экземпляром за раз, и он их не распознал).

Если я запускаю метод pd.to_datetime, он показывает ошибку из-за этих экземпляров на испанском или других языках (номер 7 и 9). Поэтому я подумал о создании регулярного выражения, но я просто не могу заставить его работать. Как я могу подойти к решению этой проблемы?

Я привожу очень упрощенный пример DF, который включает в себя различные форматы даты, поскольку существует более 800 тыс. экземпляров.

    a = {'date/time': {0: 'Jan 1, 2020 5:27:21 PM PST',
  1: 'Apr. 26, 2020 12:25:56 p.m. PDT',
  2: 'May 6, 2020 6:25:16 a.m. PDT',
  3: '11/01/2019 18:33:39 PST',
  4: 'May 15, 2020 2:25:12 a.m. PDT',
  5: '30/01/2019 18:35:23 PST',
  6: '10 feb. 2020 21:23:39 GMT-8',
  7: '28 abr. 2020 21:04:03 GMT-7',
  8: 'Jan 2, 2020 2:01:54 AM PST',
  9: '25 ago. 2020 16:07:35 GMT-7'},
 'settlement id': {0: 12493053321,
  1: 12493053321,
  2: 12493053321,
  3: 12493053321,
  4: 12493053321,
  5: 12493053321,
  6: 12493053321,
  7: 12493053321,
  8: 12493053321,
  9: 12493053321}}

import pandas as pd

b=pd.DataFrame(a)
b["fecha2"]=pd.to_datetime(b["date/time"])

большое спасибо!!!

Подход грубой силы будет похож на группировку похожих дат по их формату, их анализ и преобразование в один глобальный формат, а затем объединение всех других результатов группы для формирования единого кадра данных дат.

k33da_the_bug 24.12.2020 05:35
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
661
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете попробовать общую библиотеку синтаксического анализа дат, такую ​​как dateparser, которая поддерживает синтаксический анализ дат в более чем 200 языковых стандартах, а также во многих форматах, независимо от языка.

Столбец «дата/время» переименован в столбец «дата-время».

import dateparser
b["fecha2"] = b.datetime.apply(lambda x: dateparser.parse(x))

Вот результат для вашего ввода:

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

Если это не слишком сложно, вы можете сделать словарь замены строк. Например:

MONTH_DICT = {
    'abr': 'apr', 
    'ago': 'aug',
}

date = df["date/time"].replace(MONTH_DICT, regex=True)
date = pd.to_datetime(date, errors = "raise")
df["date"] = date

выход:

                         date/time  settlement id                       date
0       Jan 1, 2020 5:27:21 PM PST    12493053321  2020-01-01 17:27:21-08:00
1  Apr. 26, 2020 12:25:56 p.m. PDT    12493053321  2020-04-26 12:25:56-07:00
2     May 6, 2020 6:25:16 a.m. PDT    12493053321  2020-05-06 06:25:16-07:00
3          11/01/2019 18:33:39 PST    12493053321  2019-11-01 18:33:39-07:00
4    May 15, 2020 2:25:12 a.m. PDT    12493053321  2020-05-15 02:25:12-07:00
5          30/01/2019 18:35:23 PST    12493053321  2019-01-30 18:35:23-08:00
6      10 feb. 2020 21:23:39 GMT-8    12493053321  2020-02-10 21:23:39+08:00
7      28 abr. 2020 21:04:03 GMT-7    12493053321  2020-04-28 21:04:03+07:00
8       Jan 2, 2020 2:01:54 AM PST    12493053321  2020-01-02 02:01:54-08:00
9      25 ago. 2020 16:07:35 GMT-7    12493053321  2020-08-25 16:07:35+07:00

Это вызовет ошибку, если он не сможет проанализировать дату (вместо того, чтобы молча преобразовать). Обратите внимание, что эта простая версия заменит любое появление подстрок в найденных ключах MONTH_DICT.


Я использовал синтаксический анализ и все типы форматов дат, возвращая читаемый год, месяц, день, час, минуту.

затем я преобразовал их в строковое время с определенным форматом «%Y-%m-%d::%H-%M»

from dateutil.parser import parse
from datetime import datetime
dt1=parse('30/01/2019 18:35:23 PST')
dt1
datetime.datetime(2019, 1, 30, 18, 35, 23)
dt2=parse('Jan 1, 2020 5:27:21 PM PST')
dt2
datetime.datetime(2020, 1, 1, 17, 27, 21)
dt3=parse('10 feb. 2020 21:23:39 GMT-8')
dt3
datetime.datetime(2020, 2, 10, 21, 23, 39, tzinfo=tzoffset(None, 28800))
parse('May 15, 2020 2:25:12 a.m. PDT')
C:\ProgramData\Anaconda3\lib\site-packages\dateutil\parser\_parser.py:1206: UnknownTimezoneWarning: tzname PDT identified but not understood.  Pass `tzinfos` argument in order to correctly return a timezone-aware datetime.  In a future version, this will raise an exception.
  category=UnknownTimezoneWarning)
datetime.datetime(2020, 5, 15, 2, 25, 12)
dt11 = datetime(2020, 5, 15, 2, 25, 12)

print(dt11.strftime('%Y-%m-%d::%H-%M'))

2020-05-15::02-25

dt22=print(dt2.strftime('%Y-%m-%d::%H-%M'))

2020-01-01::17-27


большое спасибо. хотя мне это не помогло. Когда я запускаю это: parse('28 abr. 2020 21:04:03 GMT-7'), я получаю ParserError: Unknown string format: 28 abr. 2020 21:04:03 GMT-7 Что я делаю не так? что я должен делать неправильно?

Gustavo Zárate 24.12.2020 21:46

Вы пробовали другие предлагаемые решения? они супер аккуратные

Silvia 25.12.2020 03:34

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