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:]
我有一个数据集,它标记了四年来每分钟发生的事件。这是一个示例:
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:]