Python datetime.timestamp在应用和数据帧选择中返回不同的值 问题:
请参阅下面演示问题的代码。创建一个简单的dataframe,其中一行一列包含一个datetime实例。如您所见,对datetime对象调用Python datetime.timestamp在应用和数据帧选择中返回不同的值 问题:,python,python-3.x,pandas,datetime,Python,Python 3.x,Pandas,Datetime,请参阅下面演示问题的代码。创建一个简单的dataframe,其中一行一列包含一个datetime实例。如您所见,对datetime对象调用timestamp()将返回1581894000.0。通过数据帧选择datetime对象并调用timestamp()将给出1581897600.0。使用pandasapply函数调用“日期”列每行的datetime.timestamp时,返回值变为1581894000.0。我希望在所有情况下都能得到相同的时间戳值 In[19]: d = datetime(20
timestamp()
将返回1581894000.0
。通过数据帧选择datetime对象并调用timestamp()
将给出1581897600.0
。使用pandasapply
函数调用“日期”列每行的datetime.timestamp
时,返回值变为1581894000.0
。我希望在所有情况下都能得到相同的时间戳
值
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 <----------------------------------+
问题在于时区意识
pandas
并不总是能很好地使用datetime模块,有些决策与标准库不同,在本例中,如何处理不知道时区的datetime对象
这个特定的问题似乎是一个基于
是的,对于tz naive,我们将时间戳当作UTC来实现。除此之外,这确保了无论代码在哪里运行,我们都能获得相同的行为
因此,为了得到一致的答案,您需要一个UTC本地化时区,以便datetime.timestamp使用该时区而不是您机器的本地时区
谢谢我想我现在理解了这个问题,并试图坚持使用pandas中的功能。请参阅我的问题的编辑部分,了解我是如何使用您的建议修复的。@MartinRindarøy您可以稍微了解一下,但我认为问题主要在于日期时间。时间戳使用您的系统确定为“本地时间”的任何东西,因此除非是UTC,否则它们不会匹配。@ALollz:这是原因吗
datetime.timestamp(p)
从p=pd.Timestamp(2020,2,17)
上的pd.Timestamp.Timestamp(p)
返回不同的值,尽管pd.Timestamp
是datetime.datetime
的子类?@ALollz:谢谢。我从你的答案和链接中学到了不少新东西:)+1
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
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