Итак, я работаю с фреймом данных с датами, хранящимися в виде строк в разных форматах (почему люди это делают??), и мне нужно превратить их в объекты даты и времени. Дело в том, что они не только в разных форматах, но и на разных языках. Я думаю, что единственный способ приблизиться к этому — использовать 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"])
большое спасибо!!!
Вы можете попробовать общую библиотеку синтаксического анализа дат, такую как 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 Что я делаю не так? что я должен делать неправильно?
Вы пробовали другие предлагаемые решения? они супер аккуратные
Подход грубой силы будет похож на группировку похожих дат по их формату, их анализ и преобразование в один глобальный формат, а затем объединение всех других результатов группы для формирования единого кадра данных дат.