Преобразование часового пояса np.datetime64 без потери точности

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

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

Как лучше всего это сделать?

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

Спасибо!

Можно ли добавить для этого минимальный, полный, воспроизводимый пример, демонстрирующий проблему, с которой вы столкнулись? Будет легче ответить на вопрос, с чем можно поиграть.

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

Ответы 1

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

Похоже, что 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, а не гражданского времени).

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