我在熊猫中有一些数据采样问题。我正试图将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_upsampling移动1,执行
series_upsampled = series_upsampled.shift(-1)
注意开始时的NaN
值(或者如果您移动您的序列,则在最后)。