datetime 和 pandas 之间的 Unix Epoche 值不匹配
Unix Epoche value mismatch between datetime and pandas
我将没有时区信息的日期时间对象存储在 pandas 数据框中。
检索时间戳信息时,时间戳与从原始日期时间对象中获取的时间戳不同。
import pandas as pd
from datetime import datetime
dt = datetime.now()
print(dt)
print(dt.timestamp())
df = pd.DataFrame(data=[(dt)],columns=["date"])
print(df)
epoche_from_pandas = df.date.apply(lambda x: x.timestamp()).values[0]
print(epoche_from_pandas)
打印 pandas 数据框显示相同的日期时间字符串,但纪元值不同。两个时间戳都偏移了 3600 秒,这相当于我当地的时区差异(+1 小时)。
2020-03-20 01:05:05.457290
1584662705.45729
2020-03-20 01:05:05.457290
1584666305.45729
我的假设是 pandas 使用它自己的内部表示,忽略纪元值(可能使用年、月、日、小时...组件创建)并以 unix 时间打印(未本地化) .这意味着虽然两个打印语句都产生相同的字符串,但 pandas 时间实际上提前 1 小时,因为它反映了通常滞后 1 小时的 unix。
以上是否正确?
从技术上讲,这还不是问题的解决方案,但我发现了一段更清晰的代码,它似乎复制了这个问题:
from datetime import datetime
import pandas as pd
dt = datetime.now()
print(f"dt: {dt}")
print(f"dt timestamp: {dt.timestamp()}\n")
pd_ts = pd.Timestamp(dt)
print(f"pd Ts: {pd_ts}")
print(f"pd Ts .timestamp(): {pd_ts.timestamp()}")
print(dt.timestamp() - pd_ts.timestamp())
输出:
dt: 2020-03-19 21:06:12.627798
dt timestamp: 1584666372.627798
pd Ts: 2020-03-19 21:06:12.627798
pd Ts .timestamp(): 1584651972.627798
14400.0
使用 to_pydatetime() 将数据转换为 python 日期时间对象,然后 timestamp()
returns 相同的值。
import pandas as pd
from datetime import datetime
dt = datetime.now()
print(dt)
print(dt.timestamp())
df = pd.DataFrame(data=[(dt)],columns=["date"])
print(df)
epoche_from_pandas = df.date.apply(lambda x: x.to_pydatetime().timestamp()).values[0]
print(epoche_from_pandas)
结果:
2020-03-19 21:20:56.633482
1584667256.633482
date
0 2020-03-19 21:20:56.633482
1584667256.633482
我将没有时区信息的日期时间对象存储在 pandas 数据框中。 检索时间戳信息时,时间戳与从原始日期时间对象中获取的时间戳不同。
import pandas as pd
from datetime import datetime
dt = datetime.now()
print(dt)
print(dt.timestamp())
df = pd.DataFrame(data=[(dt)],columns=["date"])
print(df)
epoche_from_pandas = df.date.apply(lambda x: x.timestamp()).values[0]
print(epoche_from_pandas)
打印 pandas 数据框显示相同的日期时间字符串,但纪元值不同。两个时间戳都偏移了 3600 秒,这相当于我当地的时区差异(+1 小时)。
2020-03-20 01:05:05.457290
1584662705.45729
2020-03-20 01:05:05.457290
1584666305.45729
我的假设是 pandas 使用它自己的内部表示,忽略纪元值(可能使用年、月、日、小时...组件创建)并以 unix 时间打印(未本地化) .这意味着虽然两个打印语句都产生相同的字符串,但 pandas 时间实际上提前 1 小时,因为它反映了通常滞后 1 小时的 unix。
以上是否正确?
从技术上讲,这还不是问题的解决方案,但我发现了一段更清晰的代码,它似乎复制了这个问题:
from datetime import datetime
import pandas as pd
dt = datetime.now()
print(f"dt: {dt}")
print(f"dt timestamp: {dt.timestamp()}\n")
pd_ts = pd.Timestamp(dt)
print(f"pd Ts: {pd_ts}")
print(f"pd Ts .timestamp(): {pd_ts.timestamp()}")
print(dt.timestamp() - pd_ts.timestamp())
输出:
dt: 2020-03-19 21:06:12.627798
dt timestamp: 1584666372.627798
pd Ts: 2020-03-19 21:06:12.627798
pd Ts .timestamp(): 1584651972.627798
14400.0
使用 to_pydatetime() 将数据转换为 python 日期时间对象,然后 timestamp()
returns 相同的值。
import pandas as pd
from datetime import datetime
dt = datetime.now()
print(dt)
print(dt.timestamp())
df = pd.DataFrame(data=[(dt)],columns=["date"])
print(df)
epoche_from_pandas = df.date.apply(lambda x: x.to_pydatetime().timestamp()).values[0]
print(epoche_from_pandas)
结果:
2020-03-19 21:20:56.633482
1584667256.633482
date
0 2020-03-19 21:20:56.633482
1584667256.633482