datetime.timestamp 在 Pandas Apply 和 Dataframe 选择中返回不同的值



问题

请参阅下面演示该问题的代码。创建一个简单的 pandas 数据帧,其中包含一行和一列,其中包含一个日期时间实例。如您所见,在 datetime 对象上调用timestamp()会返回1581894000.0。通过数据帧选择日期时间对象并调用timestamp()1581897600.0.当使用 pandasapply函数在列"date"的每一行上调用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_datetimeTimestamp,如下所示似乎可以解决问题。

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

问题是时区意识。pandas并不总是很好地与日期时间模块配合使用,并且某些决策与标准库不同,在这种情况下,如何处理时区不知道的日期时间对象。

这个特定问题似乎是基于这个开放问题的设计选择

是的,对于 tz-naïve 我们实现时间戳,就好像它是 UTC 一样。除此之外,这可确保无论代码在何处运行,我们都会获得相同的行为。

因此,为了获得一致的答案,您需要一个UTC本地化的时区,以便datetime.timestamp使用该时区而不是机器的本地时区。

<小时 />
from datetime import datetime
import pytz
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

最新更新