在 pandas 中使用重采样时如何处理从夏令时到冬令时的变化
How to deal with change from summer to winter time when using resampling in pandas
我有一个要用于负载预测的数据框。数据每 15 分钟记录一次。我首先想通过计算每小时的平均值来重新采样数据。为此,我使用了 pandas 中的重采样功能
new_df = df['Load'].resample('1H').mean()
基本上这不是问题,只要时间数据关于冬夏时间是一致的。然而,当有一个开关时,这会出现问题(并且我得到一个类型错误)。所以在这里你可以看到显示从夏季到冬季时间变化的数据摘录
这里是从冬令时改为夏令时的数据:
在第一种情况下,某些小时值(02:00、02:15、02:30、02:45)存在 2 次,这就是为什么我在尝试重采样时出错的原因.在后一种情况下,缺少这些特定时间的值。现在我的问题是如何处理这个问题?有没有办法告诉 pandas 一个是夏令时,另一个是冬令时?在数据本身中,这通过添加“+02:00”或“+01:00”来表示,但这仍然是 pandas 的问题。或者您能考虑其他解决方案吗?一种天真的做法是在从夏令时更改为冬令时(第一种情况)时只删除 4 条数据记录,而在从冬令时更改为夏令时时复制前 4 条数据记录。
提示:没有人有想法或建议吗?其他人也应该会出现此问题。
您似乎有 Index
个时间戳(或可能是字符串),但没有 DatetimeIndex
,因为 DatetimeIndex
无法保存具有异构时区信息的时间戳。
这很笨拙,所以我的建议是先创建一个合适的 DatetimeIndex
,然后再进行任何您之后需要做的重采样。
这是一个带有混合时区时间戳的小型 DataFrame:
df = pd.DataFrame(
[1, 2],
index=pd.Index([pd.Timestamp('12:00:00+01:00'), pd.Timestamp('12:00:00+00:00')])
)
它没有 DatetimeIndex
:
>>> df
0
2021-05-31 12:00:00+01:00 1
2021-05-31 12:00:00+00:00 2
>>> type(df.index)
<class 'pandas.core.indexes.base.Index'>
为了df
构造一个DatetimeIndex
,我们需要决定一个共同的时区,所以让我们使用UTC+0。
df.index = pd.to_datetime(df.index, utc=True)
DataFrame 现在看起来像这样并且有一个 DatetimeIndex
:
>>> df
0
2021-05-31 11:00:00+00:00 1
2021-05-31 12:00:00+00:00 2
>>> type(df.index)
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>
注意 2021-05-31 12:00:00+01:00
是如何变成 2021-05-31 11:00:00+00:00
的。
我有一个要用于负载预测的数据框。数据每 15 分钟记录一次。我首先想通过计算每小时的平均值来重新采样数据。为此,我使用了 pandas 中的重采样功能
new_df = df['Load'].resample('1H').mean()
基本上这不是问题,只要时间数据关于冬夏时间是一致的。然而,当有一个开关时,这会出现问题(并且我得到一个类型错误)。所以在这里你可以看到显示从夏季到冬季时间变化的数据摘录
这里是从冬令时改为夏令时的数据:
在第一种情况下,某些小时值(02:00、02:15、02:30、02:45)存在 2 次,这就是为什么我在尝试重采样时出错的原因.在后一种情况下,缺少这些特定时间的值。现在我的问题是如何处理这个问题?有没有办法告诉 pandas 一个是夏令时,另一个是冬令时?在数据本身中,这通过添加“+02:00”或“+01:00”来表示,但这仍然是 pandas 的问题。或者您能考虑其他解决方案吗?一种天真的做法是在从夏令时更改为冬令时(第一种情况)时只删除 4 条数据记录,而在从冬令时更改为夏令时时复制前 4 条数据记录。
提示:没有人有想法或建议吗?其他人也应该会出现此问题。
您似乎有 Index
个时间戳(或可能是字符串),但没有 DatetimeIndex
,因为 DatetimeIndex
无法保存具有异构时区信息的时间戳。
这很笨拙,所以我的建议是先创建一个合适的 DatetimeIndex
,然后再进行任何您之后需要做的重采样。
这是一个带有混合时区时间戳的小型 DataFrame:
df = pd.DataFrame(
[1, 2],
index=pd.Index([pd.Timestamp('12:00:00+01:00'), pd.Timestamp('12:00:00+00:00')])
)
它没有 DatetimeIndex
:
>>> df
0
2021-05-31 12:00:00+01:00 1
2021-05-31 12:00:00+00:00 2
>>> type(df.index)
<class 'pandas.core.indexes.base.Index'>
为了df
构造一个DatetimeIndex
,我们需要决定一个共同的时区,所以让我们使用UTC+0。
df.index = pd.to_datetime(df.index, utc=True)
DataFrame 现在看起来像这样并且有一个 DatetimeIndex
:
>>> df
0
2021-05-31 11:00:00+00:00 1
2021-05-31 12:00:00+00:00 2
>>> type(df.index)
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>
注意 2021-05-31 12:00:00+01:00
是如何变成 2021-05-31 11:00:00+00:00
的。