如何对熊猫中的时间序列数据进行下采样?

时间:2018-10-19 04:21:20

标签: python pandas dataframe

我在熊猫中有一个类似这样的时间序列(按ID排序):

id    time    value
 1       0        2
 1       1        4
 1       2        5
 1       3       10
 1       4       15
 1       5       16
 1       6       18
 1       7       20
 2      15        3
 2      16        5
 2      17        8
 2      18       10
 4       6        5
 4       7        6

我希望每个组ID的下采样时间从1分钟降低到3分钟。 值是组的最大值(id和3分钟)。

输出应为:

id    time    value
 1       0        5
 1       1       16
 1       2       20
 2       0        8
 2       1       10
 4       0        6

我尝试循环需要很长时间。

有什么办法解决大型数据框的问题吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

您可以将Variable G:Set. Inductive posfijo : list _ -> list _ -> Prop := | posfijoB : forall l: list _, posfijo l l | posfijoI : forall (l1 l2: list _) (a : G), posfijo l1 l2 -> posfijo l1 (cons a l2). Infix "<<" := (posfijo) (at level 70, right associativity). Lemma Pref4_a : forall (X:Set)(l: list G)(x:G), ~ (cons x l << l). Proof. intros X l x H. 系列转换为实际的{% schema %} { "name": "Collection Mixed Products", "settings": [ { "type": "checkbox", "id": "display_image_cat", "label": "Display Image Category?", "default": true }, ... ] } ,然后将time用于矢量化解决方案:

timedelta

resample

答案 1 :(得分:3)

np.r_.ilocgroupby一起使用:

df.groupby('id')['value'].apply(lambda x: x.iloc[np.r_[2:len(x):3,-1]])

输出:

id    
1   2      5
    5     16
    7     20
2   10     8
    11    10
4   13     6
Name: value, dtype: int64

在列命名等方面走得更远。

df_out = df.groupby('id')['value']\
           .apply(lambda x: x.iloc[np.r_[2:len(x):3,-1]]).reset_index()
df_out.assign(time=df_out.groupby('id').cumcount()).drop('level_1', axis=1)

输出:

   id  value  time
0   1      5     0
1   1     16     1
2   1     20     2
3   2      8     0
4   2     10     1
5   4      6     0