.
Кейс из серии явное лучше неявного. Многие сталкиваются с задачей конвертации строковой даты в собственно дату.
.
Рассмотрим пример в пандах для файлика (в нем ничего кроме даты нет):
import pandas as pd
print(pd.version)
df = pd.read_csv("sample.csv")
df["entry_date"] = pd.to_datetime(df["entry_date"])
.
И тут нас ждут тонкости, связанные с версией pandas:
- если вы используете pandas < 2.0, то вероятнее всего код выполнится без ошибок, но ошибки собирать вы будите дальше и сколько времени уйдет на поиска: часы или дни 🤷♂️
.
А что вообще происходит: по дефлоту пандас пытается
12/01/2018 08:26
Пока сложно: это 1 декабря или 12 января??? Поищем другие цифры и находим:
13/12/2018 09:02
Ага, значит наш формат -
%d/%m/%Y %H:%M - супер. А теперь вишенка на торте, смотрим как преобразовал пандас наши строки:12/01/2018 08:26 -> 2018-12-01 08:26:00
13/12/2018 09:02 -> 2018-12-13 09:02:00
12 января стало 1 декабря, а 13 декабря осталось 13 декабря 🤦♂️
.
Версии пандас >= 2.0 кидают ошибку:
ValueError: time data "13/12/2018 09:02" doesn't match format "%m/%d/%Y %H:%M", at position 881
И сразу предлагают воспользоваться аргументом
format, в котором требуется указать пандасу с каким форматом даты он имеет дело. ☝️Будьте бдительны при использовании различных инструментов и старайтесь явно прописывать все настройки, не полагаясь на "умноту" этих средств - рано или поздно стрельнет в ногу.
ps: Clickhouse справился с задачей из коробки, только 🤫
SELECT
entry_date,
parseDateTime64BestEffort(entry_date) AS entry_date_dt
FROM
s3('https://storage.yandexcloud.net/public-bucket-6/sandbox/sample.csv',
'CSVWithNames')
WHERE
entry_date IN ('12/01/2018 08:26', '13/12/2018 09:02');
entry_date |entry_date_dt |
----------------+-------------------+
12/01/2018 08:26|2018-01-12 05:26:00|
13/12/2018 09:02|2018-12-13 06:02:00|
#pandas #datetime