Вопрос или проблема
Столбцы с временными метками хранятся внутренне в UTC, независимо от того, имеют ли они часовой пояс или нет. Об этом говорится в документации:
https://pandas.pydata.org/docs/user_guide/timeseries.html#working-with-time-zones
Итак, как информация о часовом поясе хранится внутренне? Должно быть какое-то «пометка», которая заставляет этот столбец содержать записи pd.Timestamp с tz=”America/New_York” или каким-либо другим часовым поясом.
Контекст:
Я записываю данные на диск таким образом, который не является специфичным для Python, например, я не использую pickle
. Когда я извлекаю данные, я хочу, чтобы информация о часовом поясе сохранялась.
Я не знаю, что использует Pandas для хранения часового пояса внутренне, но, возможно, что-то вроде datetime.tzinfo
.
Что касается представления информации о часовом поясе кроссплатформенно, то самым простым способом, который я могу представить, является запись временной метки в виде строки, используя определенный код формата для часового пояса, например, %z
из здесь. Когда другая система считывает строку, она может разобрать временную метку + часовой пояс в собственное представление системы.
Ответ или решение
В библиотеке Pandas временные метки, представленные с учётом часовых поясов, хранятся в формате UTC, независимо от того, имеет ли они конкретный часовой пояс или нет. Это фундаментальное положение объясняет, как Pandas управляет временными данными и как он внутренне обрабатывает информацию о часовых поясах.
Хранение временных меток и информации о часовом поясе
Внутренне Pandas использует тип данных pd.Timestamp
, который хранит значение времени в формате UTC. Важно отметить, что при создании временных меток с часовым поясом, таких как pd.Timestamp('2023-01-01 12:00', tz='America/New_York')
, библиотека автоматически конвертирует это значение во временную метку в UTC, чтобы обеспечить единообразие хранения.
Что касается хранения информации о часовом поясе, Pandas действительно использует структуру datetime.tzinfo
для хранения метаданных о часовом поясе. Это значит, что при создании временной метки с указанным часовым поясом он не просто хранит значения времени, но и присоединяет информацию о том, к какому часовому поясу относится это время. В этом случае можно сказать, что время в UTC является "нормализованным" значением, а информация о часовом поясе сохраняется как дополнительный атрибут.
Сохранение временных меток и поддержки переносимости
Если вы планируете хранить данные в формате, не зависящем от Python (например, в формате CSV или JSON), важно учитывать, как сохранить информацию о временных метках вместе с часовыми поясами.
Наиболее простой и широко используемый способ — это запись временной метки в виде строки в формате, который включает информацию о временном смещении. Например, можно использовать функцию форматирования strftime
для преобразования временной метки в строку с указанием часового пояса. Формат %z
из библиотеки Python позволяет получить смещение в виде строки, что облегчает извлечение и преобразование временной метки в других системах.
Пример:
import pandas as pd
# Создание временной метки с часовым поясом
timestamp = pd.Timestamp('2023-01-01 12:00', tz='America/New_York')
# Сохранение временной метки в виде строки
timestamp_str = timestamp.strftime('%Y-%m-%d %H:%M:%S %z')
print(timestamp_str) # Вывод: '2023-01-01 12:00:00 -0500'
При загрузке данных в другую систему вы сможете разобрать строку обратно в формат даты и учесть информацию о часовом поясе, используя разбор строк в соответствии с тем самым форматом.
Заключение
Таким образом, Pandas хранит информацию о часовом поясе как часть метаданных своих временных меток, что позволяет сохранять целостность и сходимость данных. При переносе информации о временных метках в другие форматы особенно важно сохранять контекст временных данных, включая информацию о часовом поясе. Использование строкового формата с указанием смещения обеспечивает переносимость и совместимость данных независимо от платформы.