Конвертировать часовой пояс np.datetime64 без потери точности - PullRequest
2 голосов
/ 22 мая 2019

У меня есть DataFrame, один из столбцов которого имеет тип datetime64 [ns].Они представляют время в часовом поясе "Европа / Лондон" и имеют точность наносекундного уровня.(Данные поступают из внешней системы)

Мне нужно преобразовать их в записи datetime64 [ns], которые вместо этого представляют UTC время.Другими словами, увеличивайте каждый день на 0 или на 1 час, в зависимости от того, будет ли запись в летнее время или нет.

Каков наилучший способ сделать это?

К сожалению,Я не мог найти поддержку часового пояса, запеченную в np.datetime64.В то же время я не могу просто напрямую конвертировать / работать с объектами datetime.datetime, так как это будет означать потерю точности.Единственное, о чем я могу думать до сих пор, - это преобразование np.datetime64 в datetime.datetime, корректировка часовых поясов, получение некоторой временной корреляции между нескорректированной и скорректированной датой time.datetime, а затем применение этой временной дельты обратно к np.datetime64.Звучит так, будто прыгаешь через много обручей, на что-то, что, я надеюсь, можно сделать проще?

Спасибо!

1 Ответ

2 голосов
/ 23 мая 2019

Похоже, pandas имеет некоторую встроенную поддержку для этого, используя аксессор dt:

import pandas as pd
import numpy as np

dt_arr = np.array(['2019-05-01T12:00:00.000000010',
                   '2019-05-01T12:00:00.000000100',],
                  dtype='datetime64[ns]')

df = pd.DataFrame(dt_arr)

# Represent naive datetimes as London time
df[0] = df[0].dt.tz_localize('Europe/London')

# Convert to UTC
df[0] = df[0].dt.tz_convert("UTC")

print(df)
                                    # 0
# 0 2019-05-01 11:00:00.000000010+00:00
# 1 2019-05-01 11:00:00.000000100+00:00

Предполагая, что вы начинаете с некоторых строк ISO 8601 в вашем np.datetime64[ns], вы можетеиспользуйте dt.tz_localize, чтобы назначить им часовой пояс, затем dt.tz_convert, чтобы преобразовать их в другой часовой пояс.

Я предупрежу, что если они входят как целые числа, такие как 1556708400000000010, есть хороший шансчто они уже представляют UTC, поскольку временные метки в секундах или наносекундах обычно времена эпох Unix , которые не зависят от часового пояса, в котором они были записаны (это число секунд / наносекундпосле эпохи Unix, а не гражданского времени).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...