问题
请参阅下面演示该问题的代码。创建一个简单的 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_datetime
和Timestamp
,如下所示似乎可以解决问题。
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