datetime.timestamp возвращает различные значения в pandas apply и выборе dataframe - PullRequest
1 голос
/ 17 февраля 2020

Вопрос

См. Код ниже, демонстрирующий проблему. Простой pandas фрейм данных создается с одной строкой и одним столбцом, содержащим один экземпляр datetime. Как видите, вызов timestamp() для объекта datetime возвращает 1581894000.0. Выбор объекта datetime через фрейм данных и вызов timestamp() дает 1581897600.0. При использовании функции pandas apply для вызова datetime.timestamp в каждой строке столбца «дата» возвращаемое значение становится 1581894000.0. Я ожидаю получить одно и то же значение timestamp во всех ситуациях.

In[19]: d = datetime(2020, 2, 17)
In[20]: d.timestamp()
Out[20]: 1581894000.0 <----------------------------------+
In[21]: df = pd.DataFrame({'date': [d]})                 |
In[22]: df                                               |
Out[22]:                                                 |
        date                                             |
0 2020-02-17                                             |
In[23]: df['date'][0]                                    |
Out[23]: Timestamp('2020-02-17 00:00:00')                |
In[24]: df['date'][0].timestamp()                        |
Out[24]: 1581897600.0 <---------------------- These should be the same
In[25]: df['date'].apply(datetime.timestamp)             |
Out[25]:                                                 | 
0    1.581894e+09                                        |
Name: date, dtype: float64                               |
In[26]: df['date'].apply(datetime.timestamp)[0]          |
Out[26]: 1581894000.0 <----------------------------------+

Редактировать

Благодаря вводу @ALollz, используя to_datetime и Timestamp из pandas , как показано ниже, похоже, это решает проблему.

In[15]: d = pd.to_datetime(datetime(2020,2,17))
In[16]: d.timestamp()
Out[16]: 1581897600.0
In[17]: df = pd.DataFrame({'date': [d]}) 
In[18]: df
Out[18]: 
        date
0 2020-02-17
In[19]: df['date'][0]
Out[19]: Timestamp('2020-02-17 00:00:00')
In[20]: df['date'][0].timestamp()
Out[20]: 1581897600.0
In[21]: df['date'].apply(pd.Timestamp.timestamp)
Out[21]: 
0    1.581898e+09
Name: date, dtype: float64
In[22]: df['date'].apply(pd.Timestamp.timestamp)[0]
Out[22]: 1581897600.0

1 Ответ

2 голосов
/ 17 февраля 2020

Проблема в осведомленности о часовом поясе. pandas не всегда хорошо работает с модулем datetime, и некоторые решения расходятся со стандартной библиотекой, в этом случае, как работать с незнакомыми объектами datetime часового пояса.

Эта конкретная c проблема, похоже, была выбрана для проектирования на основе этой открытой проблемы

Да, для tz-naive мы реализуем отметку времени, как будто это было UT C. Помимо прочего, это гарантирует, что мы получим одно и то же поведение независимо от того, где выполняется код.

Таким образом, чтобы получить согласованный ответ, вам понадобится локализованный часовой пояс UT C с указанием даты и времени. временная метка использовалась вместо локального часового пояса вашей машины.


from datetime import datetime
import pyzt

my_date = datetime(2020, 2, 17)
my_date_aware = pytz.utc.localize(my_date)

# UTC aware is the same as pandas
datetime.timestamp(my_date_aware) - pd.to_datetime(my_date).timestamp()
#0

datetime.timestamp(my_date) - pd.to_datetime(my_date).timestamp()
#18000.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...