我试图将“欧洲”“日期”列转换为“欧洲unix时间戳”列。不幸的是,我总是得到错误的unix时间戳...我的数据帧看起来像这样:
Index Date Second Measurement
0 0 2020-02-24 10:52:38 0.000 0.001155460021
1 1 2020-02-24 10:52:39 0.109 0.001124729984
2 2 2020-02-24 10:52:40 0.203 0.001119069988
我尝试了以下代码,但我总是得到第一个值(10:52:38)1582541558。但这应该是 1582537958 。问题是否取决于python“不知道“我正在使用欧洲CET?
df["DateUnix"] = df.Date.map(lambda x: x.timestamp()) #fail
timestamp = (df.Date - pd.Timestamp("1970-01-01")) // pd.Timedelta('1s') #fail
答案 0 :(得分:1)
localize
带有所需时区的datetime对象,然后再提取时间戳,例如
import pandas as pd
dt = pd.to_datetime('2020-02-24 10:52:38').tz_localize(tz='Europe/Berlin')
ts = dt.timestamp()
assert int(ts) == 1582537958
为什么?从'2020-02-24 10:52:38'
之类的字符串中获取的datetime对象是幼稚的,这意味着它不知道时区。如果再调用.timestamp()
,Python将假定datetime对象属于操作系统的时区,并在返回POSIX时间戳之前转换为UTC。
示例:
from datetime import datetime, timezone
ts_naive = datetime(2020, 5, 15).timestamp()
ts_utc = datetime(2020, 5, 15, tzinfo=timezone.utc).timestamp()
# my OS is on UTC+2, so ts_naive should be ts_utc - 2*3600:
assert ts_utc - 2*3600 == ts_naive