首页 > 解决方案 > Pandas - DateTime MultiIndex - 不明确的时间、时区和频率

问题描述

我的目标是加载考虑夏季/冬季时间(夏令时)的预测文件:

足球俱乐部 价值
25.10.2020 00:00 0
25.10.2020 00:15 1
25.10.2020 00:30 2
25.10.2020 00:45 3
25.10.2020 01:00 4
25.10.2020 01:15 5
25.10.2020 01:30 6
25.10.2020 01:45 7
2020-10-25 2A:00(仍然是夏令时/夏令时(DST)) 8
2020-10-25 2A:15 9
2020-10-25 2A:30 10
2020-10-25 2A:45 11
2020-10-25 2B:00(冬令时/无夏令时) 12
2020-10-25 2B:15 13
2020-10-25 2B:30 14
2020-10-25 2B:45 15
25.10.2020 03:00 16
25.10.2020 03:15 17
25.10.2020 03:30 18
25.10.2020 03:45 19

作为:

更新时间 足球俱乐部 价值
2020-01-01 00:00:00 2020-10-25 00:00:00+02:00 0
2020-01-01 00:00:00 2020-10-25 00:15:00+02:00 1
2020-01-01 00:00:00 2020-10-25 00:30:00+02:00 2
2020-01-01 00:00:00 2020-10-25 00:45:00+02:00 3
2020-01-01 00:00:00 2020-10-25 01:00:00+02:00 4
2020-01-01 00:00:00 2020-10-25 01:15:00+02:00 5
2020-01-01 00:00:00 2020-10-25 01:30:00+02:00 6
2020-01-01 00:00:00 2020-10-25 01:45:00+02:00 7
2020-01-01 00:00:00 2020-10-25 02:00:00+02:00(夏令时) 8
2020-01-01 00:00:00 2020-10-25 02:15:00+02:00 9
2020-01-01 00:00:00 2020-10-25 02:30:00+02:00 10
2020-01-01 00:00:00 2020-10-25 02:45:00+02:00 11
2020-01-01 00:00:00 2020-10-25 02:00:00+01:00(没有夏令时) 12
2020-01-01 00:00:00 2020-10-25 02:15:00+01:00 13
2020-01-01 00:00:00 2020-10-25 02:30:00+01:00 14
2020-01-01 00:00:00 2020-10-25 02:45:00+01:00 15
2020-01-01 00:00:00 2020-10-25 03:00:00+01:00 16
2020-01-01 00:00:00 2020-10-25 03:15:00+01:00 17
2020-01-01 00:00:00 2020-10-25 03:30:00+01:00 18
2020-01-01 00:00:00 2020-10-25 03:45:00+01:00 19

我的步骤是:

df = pd.read_csv(filePath, parse_dates = ["FC"])
df['FC'] = pd.to_datetime(df['FC'].str.replace("2A", "02").str.replace("2B", "02"), errors = "raise")
df["UpdateTime"] = extractedUpdateTime # extracted from file name before
df.set_index(["UpdateTime", "FC"], inplace = True)

该结构是我想要的目标结构。剩下的唯一问题是将 FC 中的日期时间本地化为 CET,因为我注意到 2A 和 2B 都设置为冬季?

从输出

df.index.get_level_values(1).tz_localize('CET', ambiguous=True)

错误的价值观
2020-10-25 01:00:00+02:00
2020-10-25 01:15:00+02:00
2020-10-25 01:30:00+02:00
2020-10-25 01:45:00+02:00
2020-10-25 02:00:00+01:00(2A 已经是冬季 (+00:01) 而不是 DST (+00:02))
2020-10-25 02:15:00+01:00
2020-10-25 02:30:00+01:00
2020-10-25 02:45:00+01:00
2020-10-25 02:00:00+01:00
2020-10-25 02:15:00+01:00
2020-10-25 02:30:00+01:00
2020-10-25 02:45:00+01:00
2020-10-25 03:00:00+01:00

但我希望

正确的价值观
2020-10-25 01:00:00+02:00
2020-10-25 01:15:00+02:00
2020-10-25 01:30:00+02:00
2020-10-25 01:45:00+02:00
2020-10-25 02:00:00+02:00(仍然是夏令时)
2020-10-25 02:15:00+02:00
2020-10-25 02:30:00+02:00
2020-10-25 02:45:00+02:00
2020-10-25 02:00:00+01:00(没有夏令时)
2020-10-25 02:15:00+01:00
2020-10-25 02:30:00+01:00
2020-10-25 02:45:00+01:00
2020-10-25 03:00:00+01:00

我也试过参数ambiguous = 'infer',但输出是一样的。

然后我看到了一个例子并测试了

pd.Series(df.index.get_level_values(1)).dt.tz_localize('CET', ambiguous='infer')

这给了我预期的正确输出。

那么为什么两个输出都是

df.index.get_level_values(1).tz_localize('CET', ambiguous='infer')

pd.Series(df.index.get_level_values(1)).dt.tz_localize('CET', ambiguous='infer')

不相等?

此致!

标签: pythonpandastimezoneambiguousdatetimeindex

解决方案


推荐阅读