我想对倒计时的熊猫时间序列重新采样。例如,我们设置一个简单的11天时间序列:
>>> index = pd.date_range('01-01-2018', '01-11-2018', freq='D')
>>> randint = np.random.randint(low=0, high=9, size=(len(index), 1))
>>> df = pd.DataFrame(randint, index=index, columns=['random'])
>>> print(df)
random
2018-01-01 8
2018-01-02 8
2018-01-03 1
2018-01-04 4
2018-01-05 3
2018-01-06 5
2018-01-07 2
2018-01-08 6
2018-01-09 5
2018-01-10 1
2018-01-11 3
如果每隔5天重新采样一次,我会得到:
>>> df_5d = df.resample('5D').sum()
>>> print(df_5d)
random
2018-01-01 24
2018-01-06 19
2018-01-11 3
基本上,您有3个分组:前两个组有5个成员,最后一个组有1个,总共总共11个成员:
Start End
2018-01-01 2018-01-05
2018-01-06 2018-01-10
2018-01-11 2018-01-11
>>> df_5d = df.resample('5D').sum()
>>> print(df_5d)
random
2018-01-01 8
2018-01-02 21
2018-01-07 17
并且分组如下所示。查看如何从最近的日期开始倒数'5D'
:
Start End
2018-01-01 2018-01-01
2018-01-02 2018-01-06
2018-01-07 2018-01-11
如何对倒计时的熊猫时间序列重新采样?
答案 0 :(得分:4)
一种解决方法可能是将原始 DataTable dh1 = new DataTable("data1");
dh1.Columns.Add("specification_name", typeof(string));
dh1.Columns.Add("summalar", typeof(string));
dh1.Columns.Add("address", typeof(string));
dh1.Columns.Add("id1", typeof(int));
dh1.Columns.Add("client_id", typeof(int));
dh1.Columns.Add("stack_id", typeof(int));
foreach (DataRow dd in dt.Rows)
{
DataTable temp = new DataTable("temp");
DataRow ttt = dh1.NewRow();
for (int j = 0; j < col; j++)
{
ttt[0] = dd[1];
ttt[1] = dd[2];
ttt[2] = dd[3];
ttt[3] = dd[4];
ttt[4] = dd[5];
ttt[5] = dd[6];
break;
}
dh1.Rows.Add(ttt);
}
分成两部分,以便能够使用标准的重采样,然后df
都重新采样两个数据帧,例如:
pd.concat
加上我的随机数,我得到:
res_interval = 5
df_res = pd.concat([df[:len(df)%res_interval].resample('{}D'.format(res_interval)).sum(),
df[len(df)%res_interval:].resample('{}D'.format(res_interval)).sum()])
答案 1 :(得分:2)
您可以使用
In [452]: t = np.arange(len(df.index)-1, -1, -1) // 5
In [453]: df.reset_index().groupby(t, sort=False)['index'].agg([min, max])
Out[453]:
min max
2 2018-01-01 2018-01-01
1 2018-01-02 2018-01-06
0 2018-01-07 2018-01-11
答案 2 :(得分:0)
我想我得到了一个非常简单的解决方案:
您可以按时间降序对时间序列进行排序,然后进行重新采样。
index = pd.date_range('01-01-2018', '01-11-2018', freq='D')
randint = np.random.randint(low=0, high=9, size=(len(index), 1))
df = pd.DataFrame(randint, index=index, columns=['random'])
print(df)
random
2018-01-01 0
2018-01-02 4
2018-01-03 6
2018-01-04 8
2018-01-05 3
2018-01-06 8
2018-01-07 3
2018-01-08 4
2018-01-09 5
2018-01-10 5
2018-01-11 4
使用 label 和 closed ='right' 告诉 resample 第一天应该考虑在汇总值的区间中,并且应该将其用作索引的标签。
print(df.sort_index(ascending=False).resample('5D',label='right',closed='right').sum())
random
2018-01-01 0
2018-01-06 29
2018-01-11 21