У меня есть DataFrame, один из столбцов которого имеет тип datetime64[ns]. Они представляют время в часовом поясе «Европа/Лондон» с точностью до наносекунды. (данные поступают из внешней системы)
Мне нужно преобразовать их в записи datetime64[ns], которые вместо этого представляют время универсальное глобальное время. То есть, другими словами, увеличивайте каждый день на 0 или на 1 час, в зависимости от того, относится ли запись к летнему времени или нет.
Как лучше всего это сделать?
К сожалению, я не смог найти поддержку часового пояса, встроенную в np.datetime64. В то же время я не могу просто напрямую конвертировать объекты datetime.datetime/работать с ними, так как это означало бы потерю точности. Единственное, о чем я мог думать до сих пор, - это преобразовать np.datetime64 в datetime.datetime, настроить часовые пояса, получить какую-то временную дельту между нескорректированным и скорректированным datetime.datetime, а затем применить эту временную дельту обратно к np.datetime64. Звучит как много препятствий, через которые нужно прыгнуть, чтобы что-то, что, я надеюсь, можно было сделать проще?
Спасибо!






Похоже, что 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, а не гражданского времени).
Можно ли добавить для этого минимальный, полный, воспроизводимый пример, демонстрирующий проблему, с которой вы столкнулись? Будет легче ответить на вопрос, с чем можно поиграть.