Разобрать дату и время из CSV, назначить часовой пояс и преобразовать в другой часовой пояс - Polars Python

У меня есть столбец временных меток в CSV-файле, например 2022-01-03 17:59:16.254. Как внешняя информация, я знаю, что это время в JST.

Я пытаюсь разобрать эту строку в дату и время, назначить часовой пояс JST (без изменения метки времени) и преобразовать ее в CET.

Попытка:

new = pl.scan_csv('test.csv').with_columns(
    [pl.col("timestamp").str.strptime(pl.Datetime, "%Y-%m-%d %H:%M:%S.%f", strict=True),
    ]
).select(
    [pl.col("timestamp").cast(pl.Date).alias("Date"),
     pl.col("timestamp").dt.with_time_zone("Asia/Tokyo").alias("WithTZ"),
     pl.col("timestamp").dt.with_time_zone("Asia/Tokyo").dt.cast_time_zone("Europe/Berlin").alias("WithCastTZ"),
     pl.all(),
    ]
)

new.fetch(10).write_csv("testOut.csv")

в результате я ожидал, что часть даты и времени не изменится в WithTZ. Впрочем, это моя первая строчка. Кастинг также не оказал никакого влияния.

WithTZ                     |WithCastTZ                 |timestamp
2022-01-04 02:59:16.213 JST|2022-01-04 02:59:16.213 CET|2022-01-03T17:59:16.213000000

Я думаю, что упускаю что-то очевидное..

Я подозреваю, что strptime() должен знать, что исходное время указано в JST. поэтому я попытался добавить «JST» к строке и использовать %Y-%m-%d %H:%M:%S.%f %Z в качестве средства форматирования, но получил точно такой же результат, потому что поле «отметка времени» не стало известно о tz после использования нового средства форматирования.

Kocas 09.02.2023 22:54

Ваш пример вызывает у меня исключение на последних полярах, что может помочь в отладке: ComputeError: Cannot call with_time_zone on tz-naive. Set a time zone first with cast_time_zone

jqurious 09.02.2023 23:12

@jqurious with_time_zone должен работать с наивными временными метками, cast_time_zone — нет. Не уверен, почему вы получаете эту ошибку. Я на полярах 0.16.2.

Kocas 10.02.2023 08:47

Похоже, он был добавлен на github.com/pola-rs/polars/commit/… и будет в 0.16.3 (я использую последний коммит с github) — похоже, над часовым поясом активно работают на данный момент - так что есть некоторые частые изменения.

jqurious 10.02.2023 09:10
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Методы работы с часовыми поясами:

  • dt.convert_time_zone: конвертировать из одного часового пояса в другой;
  • dt.replace_time_zone: установить/снять/изменить часовой пояс;

Итак, похоже, вы после последнего:

pl.col("timestamp").dt.replace_time_zone("Asia/Tokyo")

Чтобы затем преобразовать в Европу/Берлин:

pl.col("timestamp").dt.replace_time_zone("Asia/Tokyo").dt.convert_time_zone("Europe/Berlin")

Конечно. Исходя из Pandas, я должен был знать. FWIW, руководство по API Polars не упоминает tz_localize... Я смог обнаружить его только через просмотр класса ExprDateTimeNameSpace в модуле Python.

Kocas 10.02.2023 08:49

Вы правы, похоже не все есть в руководстве пользователя. Похоже, это может измениться, кстати: github.com/pola-rs/polars/issues/6767

ignoring_gravity 10.02.2023 09:04

обновлено в соответствии с полярами 0.16.3

ignoring_gravity 11.02.2023 10:40

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