Как Pandas хранит информацию о часовом поясе?

Вопрос или проблема

Столбцы с временными метками хранятся внутренне в 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 хранит информацию о часовом поясе как часть метаданных своих временных меток, что позволяет сохранять целостность и сходимость данных. При переносе информации о временных метках в другие форматы особенно важно сохранять контекст временных данных, включая информацию о часовом поясе. Использование строкового формата с указанием смещения обеспечивает переносимость и совместимость данных независимо от платформы.

Оцените материал
Добавить комментарий

Капча загружается...