繁体   English   中英

夏令时取消了 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() function 效果很好。 这是一个示例:

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]

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

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]

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

有没有办法强制我的数据集遵循 0–6、6–12 格式? 如果有一个额外的小时,也许从中得到的聚合仍然可以包含在 0-6 范围内?

我正在使用的时区是 Europe/Berlin,我尝试将所有内容转换为 UTC。 但是,值不在正确的日期或时间——例如,在 00:15 发生的事件将是前一天的 23:15,这会影响那些摘要统计信息。

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

你试过这个吗? 我认为它应该可以工作(首先转换为本地时区,然后通过 .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:]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM