为什么 pandas 将 UNIX 时间戳转换为多个不同的日期时间值?

Why pandas convert UNIX timestamps to multiple different date-time values?

我有一个带有 UNIX 时间戳的 pandas 数据框(这些是整数而不是时间对象)。我想将 UNIX 时间戳转换为本地时间(根据中国时区)。 因此,基于此,我尝试执行以下操作:

import pandas as pd
data = {'timestamp':  [1540651297,  1540651300, 1540651303,  1540651306,  1540651309,  1540651312]}
df = pd.DataFrame (data, columns = ['timestamp'])
df
df['timestamp1'] = pd.to_datetime(df.timestamp, unit='s')
df['timestamp2']=df['timestamp'].apply(lambda d: datetime.datetime.fromtimestamp(int(d)).strftime('%Y-%m-%d %H:%M:%S'))
df['timestamp3'] = df['timestamp1'].dt.tz_localize('Asia/Shanghai').dt.tz_convert('UTC')
timestamp timestamp1 timestamp2 timestamp3
1540651297 2018-10-27 14:41:37 2018-10-27 22:41:37 2018-10-27 06:41:37+00:00
1540651300 2018-10-27 14:41:40 2018-10-27 22:41:40 2018-10-27 06:41:40+00:00
1540651303 2018-10-27 14:41:43 2018-10-27 22:41:43 2018-10-27 06:41:43+00:00
1540651306 2018-10-27 14:41:46 2018-10-27 22:41:46 2018-10-27 06:41:46+00:00
1540651309 2018-10-27 14:41:49 2018-10-27 22:41:49 2018-10-27 06:41:49+00:00
df['timestamp1'] = pd.to_datetime(df.timestamp, unit='s')

此语句在此处创建一个包含当前时间的日期时间值的列。日期时间值是天真的时区和 UTC。

df['timestamp2']=df['timestamp'].apply(lambda d: datetime.datetime.fromtimestamp(int(d)).strftime('%Y-%m-%d %H:%M:%S'))

datetime.datetime.fromtimestamp 接受时间戳和 returns 本地日期时间。对于 ASIA/Shanghai,与 UTC 的偏移量将为 +8。日期时间值仍然是时区朴素的。

df['timestamp1'].dt.tz_localize('Asia/Shanghai')

这个 returns 一个使用时区朴素的具有时区感知日期时间的系列(timestamp1)。

2018-10-27 14:41:37 变为 2018-10-27 14:41:37+08:00.

df['timestamp1'].dt.tz_localize('Asia/Shanghai').dt.tz_convert('UTC')

dt.tz_convert('UTC') 将 tz 感知日期时间从一个时区转换为另一个时区。 2018-10-27 14:41:37+08:00 转换为 UTC 日期时间,时区为 2018-10-27 06:41:37+00:00。 你应该做的是

df['timestamp3'] = df['timestamp1'].dt.tz_localize('UTC').dt.tz_convert('Asia/Shanghai')

将时区原始 UTC 日期时间转换为时区感知 UTC 日期时间,然后再转换为 Asia/Shanghai 时区 结果将是:

timestamp timestamp1 timestamp2 timestamp3
1540651297 2018-10-27 14:41:37 2018-10-27 22:41:37 2018-10-27 22:41:37+08:00
1540651300 2018-10-27 14:41:40 2018-10-27 22:41:40 2018-10-27 22:41:40+08:00
1540651303 2018-10-27 14:41:43 2018-10-27 22:41:43 2018-10-27 22:41:43+08:00
1540651306 2018-10-27 14:41:46 2018-10-27 22:41:46 2018-10-27 22:41:46+08:00
1540651309 2018-10-27 14:41:49 2018-10-27 22:41:49 2018-10-27 22:41:49+08:00