Python Pandas 对数据点之间的平均值进行上采样(15 分钟到 1 分钟)
Python Pandas Upsampling on average values between data points (15min to 1min)
我在 pandas 中的数据重采样有一些问题。我试图将 15 分钟值上采样到 1 分钟值。重新采样的数据帧值应该包含原始数据帧的两个值之间的总和。此代码生成问题的提取。
import pandas as pd
import numpy as np
dates = pd.DataFrame(pd.date_range(start="20190101",end="20200101", freq="15min"))
values = pd.DataFrame(np.random.randint(0,10,size=(35041, 1)))
df = pd.concat([dates,values], axis = 1)
df = df.set_index(pd.DatetimeIndex(df.iloc[:,0]))
print(df.resample("min").agg("sum").head(16))
这是一个示例输出:
2019-01-01 00:00:00 3
2019-01-01 00:01:00 0
2019-01-01 00:02:00 0
2019-01-01 00:03:00 0
2019-01-01 00:04:00 0
2019-01-01 00:05:00 0
2019-01-01 00:06:00 0
2019-01-01 00:07:00 0
2019-01-01 00:08:00 0
2019-01-01 00:09:00 0
2019-01-01 00:10:00 0
2019-01-01 00:11:00 0
2019-01-01 00:12:00 0
2019-01-01 00:13:00 0
2019-01-01 00:14:00 0
2019-01-01 00:15:00 3
显示为 0 的值应替换为两个值的总和(在此示例中:2019-01-01 00:00:00 3;和 2019-01-01 00:15:00 3)等于 6,这应该在时间范围内均匀分布。
2019-01-01 00:00:00 6/15
2019-01-01 00:01:00 6/15
2019-01-01 00:02:00 6/15
2019-01-01 00:03:00 6/15
2019-01-01 00:04:00 6/15
2019-01-01 00:05:00 6/15
2019-01-01 00:06:00 6/15
2019-01-01 00:07:00 6/15
2019-01-01 00:08:00 6/15
2019-01-01 00:09:00 6/15
2019-01-01 00:10:00 6/15
2019-01-01 00:11:00 6/15
2019-01-01 00:12:00 6/15
2019-01-01 00:13:00 6/15
2019-01-01 00:14:00 6/15
2019-01-01 00:15:00 6/15
应该对整个 Dataframe 上的每个重采样组执行此操作。
换句话说,原始数据帧和重采样数据帧的总和应该相等。
感谢您的帮助。
首先,就我个人而言,如果只有一列,我建议使用系列。
series = pd.Series(index=pd.date_range(start="20190101",end="20200101",
freq="15min"), data=(np.random.randint(0,10,size=(35041,))).tolist())
然后,我将创建一个包含微小值的新索引,计算这些值的累计和并在这些值之间进行插值。在您的用例中,建议使用 "linear" 作为插值方法:
beginning = series.index[0]
end = series.index[-1]
new_index = pd.date_range(start, end, freq="1T")
cumsum = series.cumsum()
cumsum = result.reindex(new_index)
cumsum = result.interpolate("linear")
之后,您会得到一个插值累积和,您可以通过以下方式将其转换回搜索值:
series_upsampled = cumsum.diff()
如果需要,可以将 series_upsampled 移动 1,执行
series_upsampled = series_upsampled.shift(-1)
注意开头的 NaN
值(或者如果您移动序列,则在结尾)。
我在 pandas 中的数据重采样有一些问题。我试图将 15 分钟值上采样到 1 分钟值。重新采样的数据帧值应该包含原始数据帧的两个值之间的总和。此代码生成问题的提取。
import pandas as pd
import numpy as np
dates = pd.DataFrame(pd.date_range(start="20190101",end="20200101", freq="15min"))
values = pd.DataFrame(np.random.randint(0,10,size=(35041, 1)))
df = pd.concat([dates,values], axis = 1)
df = df.set_index(pd.DatetimeIndex(df.iloc[:,0]))
print(df.resample("min").agg("sum").head(16))
这是一个示例输出:
2019-01-01 00:00:00 3
2019-01-01 00:01:00 0
2019-01-01 00:02:00 0
2019-01-01 00:03:00 0
2019-01-01 00:04:00 0
2019-01-01 00:05:00 0
2019-01-01 00:06:00 0
2019-01-01 00:07:00 0
2019-01-01 00:08:00 0
2019-01-01 00:09:00 0
2019-01-01 00:10:00 0
2019-01-01 00:11:00 0
2019-01-01 00:12:00 0
2019-01-01 00:13:00 0
2019-01-01 00:14:00 0
2019-01-01 00:15:00 3
显示为 0 的值应替换为两个值的总和(在此示例中:2019-01-01 00:00:00 3;和 2019-01-01 00:15:00 3)等于 6,这应该在时间范围内均匀分布。
2019-01-01 00:00:00 6/15
2019-01-01 00:01:00 6/15
2019-01-01 00:02:00 6/15
2019-01-01 00:03:00 6/15
2019-01-01 00:04:00 6/15
2019-01-01 00:05:00 6/15
2019-01-01 00:06:00 6/15
2019-01-01 00:07:00 6/15
2019-01-01 00:08:00 6/15
2019-01-01 00:09:00 6/15
2019-01-01 00:10:00 6/15
2019-01-01 00:11:00 6/15
2019-01-01 00:12:00 6/15
2019-01-01 00:13:00 6/15
2019-01-01 00:14:00 6/15
2019-01-01 00:15:00 6/15
应该对整个 Dataframe 上的每个重采样组执行此操作。 换句话说,原始数据帧和重采样数据帧的总和应该相等。 感谢您的帮助。
首先,就我个人而言,如果只有一列,我建议使用系列。
series = pd.Series(index=pd.date_range(start="20190101",end="20200101",
freq="15min"), data=(np.random.randint(0,10,size=(35041,))).tolist())
然后,我将创建一个包含微小值的新索引,计算这些值的累计和并在这些值之间进行插值。在您的用例中,建议使用 "linear" 作为插值方法:
beginning = series.index[0]
end = series.index[-1]
new_index = pd.date_range(start, end, freq="1T")
cumsum = series.cumsum()
cumsum = result.reindex(new_index)
cumsum = result.interpolate("linear")
之后,您会得到一个插值累积和,您可以通过以下方式将其转换回搜索值:
series_upsampled = cumsum.diff()
如果需要,可以将 series_upsampled 移动 1,执行
series_upsampled = series_upsampled.shift(-1)
注意开头的 NaN
值(或者如果您移动序列,则在结尾)。