У меня есть столбец временных меток в 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
Я думаю, что упускаю что-то очевидное..
Ваш пример вызывает у меня исключение на последних полярах, что может помочь в отладке: ComputeError: Cannot call with_time_zone on tz-naive. Set a time zone first with cast_time_zone
@jqurious with_time_zone
должен работать с наивными временными метками, cast_time_zone
— нет. Не уверен, почему вы получаете эту ошибку. Я на полярах 0.16.2.
Похоже, он был добавлен на github.com/pola-rs/polars/commit/… и будет в 0.16.3
(я использую последний коммит с github) — похоже, над часовым поясом активно работают на данный момент - так что есть некоторые частые изменения.
Методы работы с часовыми поясами:
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.
Вы правы, похоже не все есть в руководстве пользователя. Похоже, это может измениться, кстати: github.com/pola-rs/polars/issues/6767
обновлено в соответствии с полярами 0.16.3
Я подозреваю, что strptime() должен знать, что исходное время указано в JST. поэтому я попытался добавить «JST» к строке и использовать
%Y-%m-%d %H:%M:%S.%f %Z
в качестве средства форматирования, но получил точно такой же результат, потому что поле «отметка времени» не стало известно о tz после использования нового средства форматирования.