Pandas 中的重采样因夏令时而中断

Resampling in Pandas is thrown off by daylight savings time

我有一个数据集,它标记了四年来每分钟发生的事件。这是一个示例:

In [547]: result
Out[547]: 
      uuid                 timestamp  col1  col2  col3
0      100 2016-03-30 00:00:00+02:00     NaN NaN  NaN
1      100 2016-03-30 00:01:00+02:00     NaN NaN  NaN
2      100 2016-03-30 00:02:00+02:00     NaN NaN  NaN
3      100 2016-03-30 00:03:00+02:00     1.49 1.79  0.979
4      100 2016-03-30 00:04:00+02:00     NaN NaN  NaN
   ...                       ...     ...  ..  ...
1435   100 2016-03-30 23:55:00+02:00     NaN NaN  NaN
1436   100 2016-03-30 23:56:00+02:00     1.39 2.19  1.09
1437   100 2016-03-30 23:57:00+02:00     NaN NaN  NaN
1438   100 2016-03-30 23:58:00+02:00     NaN NaN  NaN
1439   100 2016-03-30 23:59:00+02:00     NaN NaN  NaN

[1440 rows x 5 columns]

每次出现非空白行时,我都会尝试获取摘要统计信息,并且每六个小时获取一次这些统计信息。为此,resample() 函数效果很好。这是一个示例:

In [548]: result = result.set_index('timestamp').tz_convert('Europe/Berlin').resample('6h', label='right', closed='right', origin='start_day').agg(['mean', 'last', 'count']).iloc[:,-9:]

Out[548]: 
                           col1_mean  col1_last  ...  col3_last  times_changed
timestamp                                            ...                         
2016-03-30 00:00:00+02:00          NaN          NaN  ...       NaN              0
2016-03-30 07:00:00+02:00       1.0690        1.069  ...     1.279              1
2016-03-30 13:00:00+02:00       1.0365        1.009  ...     1.239              4
2016-03-30 19:00:00+02:00       1.0150        0.989  ...     1.209              5
2016-03-30 01:00:00+02:00       1.1290        1.129  ...     1.329              1

[5 rows x 7 columns]

这看起来不错,是我想要使用的格式。但是,当我 运行 我的所有数据代码(跨越多年)时,这里是输出的摘录:

In [549]: result

Out[549]: 
                           col1_mean  col1_last  ...  col3_last  times_changed
timestamp                                            ...                         
2016-03-27 00:00:00+01:00          NaN          NaN  ...       NaN              0
2016-03-27 07:00:00+02:00       1.0690        1.069  ...     1.279              1
2016-03-27 13:00:00+02:00       1.0365        1.009  ...     1.239              4
2016-03-27 19:00:00+02:00       1.0150        0.989  ...     1.209              5
2016-03-28 01:00:00+02:00       1.1290        1.129  ...     1.329              1

[5 rows x 7 columns]

新索引考虑了 DST 并将所有内容都推迟了一个小时。我希望新时间仍然在 0–6、6–12 等之间

有没有办法强制我的数据集遵循 0–6、6–12 格式?如果有一个额外的小时,也许那个聚合仍然可以塞进 0–6 范围内?

我使用的时区是 Europe/Berlin,我尝试将所有内容都转换为 UTC。但是,值的日期或时间不正确——例如,在 00:15hrs 出现的时间应该是前一天的 23:15hrs,这会导致这些摘要统计信息丢失。

有什么创造性的解决方案可以解决这个问题吗?

你试过这个吗?我认为它应该工作 (首先转换为本地时区,然后将时区信息截断 .tz_localize(None))

result = result.set_index('timestamp').tz_convert('Europe/Berlin').tz_localize(None).resample('6h', label='right', closed='right', origin='start_day').agg(['mean', 'last', 'count']).iloc[:,-9:]