Преобразование pandas отметки времени в эпоху POSIX с помощью strftime () - PullRequest
1 голос
/ 18 июня 2020

У меня есть отметка времени pandas, и я хочу преобразовать ее в строковое представление как отметку времени эпохи POSIX. Я могу сделать отметку времени и проверить ее двумя способами:

>>> import pandas as ps
>>> ts = ps.Timestamp("2020-06-16 07:00:00-04:00")
>>> ts
Timestamp('2020-06-16 07:00:00-0400', tz='pytz.FixedOffset(-240)')
>>> ts.timestamp()
1592305200.0
>>> ts.value
1592305200000000000

И это значение проверяется:

$ TZ=EST5EDT date -d @1592305200 -Iseconds
2020-06-16T07:00:00-04:00

Но если я попытаюсь получить это значение в формате строки , Я получаю что-то очень странное:

>>> ts.strftime("%s")
'1592319600'

Это значение, которое не должно зависеть от часовых поясов, неверно.

$ TZ=EST5EDT date -d @1592319600 -Iseconds
2020-06-16T11:00:00-04:00

Это ожидаемое поведение от pandas Timestamp ? Если нет, то что я делаю не так?

1 Ответ

0 голосов
/ 23 июля 2020

Чтобы ответить на ваш вопрос, ожидается поведение Pandas Timestamp. Однако использование маленького регистра %s может дать очень неожиданные результаты и поэтому не может быть рекомендовано. Ниже я приведу некоторые сведения.

Предпосылки для решения

При использовании datetime, Python фактически вызывает функцию strftime() библиотеки C библиотеки. Таким образом, коды формата могут различаться на разных платформах. Важно отметить, что маленький корпус %s не поддерживается Python strftime(), как указано в документации . Это работает только потому, что может поддерживаться функцией вашей платформы. На некоторых платформах %s возвращает количество секунд с начала 1970-01-01 00:00:00 +0000 (UT C), но использует ваш local часовой пояс, а не пояс, который был указан в Timestamp. Использование %s приведет к совершенно другим значениям в моем часовом поясе. Подводя итог, не используйте .strftime("%s), так как это может привести к очень неожиданным результатам.

>>> import pandas as pd
>>> ts = pd.Timestamp("2020-06-16 07:00:00-0400")
>>> ts.strftime("%s %z")
Out: '1592290800 -0400'
>>> ts = pd.Timestamp("2020-06-16 07:00:00")
>>> ts.strftime("%s %z")
Out: '1592290800 '

Решение

Если вы хотите, чтобы Timestamp как строка, вы можете использовать

>>> "%d" % ts.timestamp()
Out: '1592305200'

Learning by stackoverflowing,

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