【问题标题】:Resample sum keeping the index of last observation per day pandas重新采样总和保持每天熊猫最后一次观察的指数
【发布时间】:2019-01-16 19:17:09
【问题描述】:

我有一个数据框:

Localmax              symbol  dvol        idx
2016-10-19 09:05:00   st1     5172.159  2016-10-19 09:05:00
2016-10-19 09:05:00   st2     5172.18   2016-10-19 09:05:00 
2016-10-19 17:30:00   st1     5000      2016-10-19 17:30:00
2016-10-19 17:40:00   st2     8000      2016-10-19 17:40:00

我怎样才能对每个符号进行重新采样,以便我每天有一个 dvol 的总和,保持每天最后一次观察的索引?

我试过了:

> df['idx']=df.index 
> dvol_sum = df.groupby(['symbol', Grouper(freq='D')])['dvol', 'idx'].agg(['sum'])

但它只生成一列 dvol,以及时间戳为 00:00:00 的索引..

预期的输出是:

    Localmax         symbol         dvol              
2016-10-19 17:30:00   st1     sum of dvol for 2016-10-19 for st1 
2016-10-19 17:40:00   st2     sum of dvol for 2016-10-19 for st2

【问题讨论】:

  • 你想要的输出是什么?
  • 已添加到问题中

标签: python pandas resampling


【解决方案1】:

您需要在列符号上使用groupbysum。 然后使用groupbymax 选择一个索引为localmax的最新条目:

df = pd.DataFrame({'Localmax':['2016-10-19 09:05:00','2016-10-19 09:05:00','2016-10-19 17:30:00','2016-10-19 17:40:00'],
               'symbol':['st1','st2','st1','st2'], 'dvol':[5172.159,5172.18,5000,8000]})


df['Localmax'] = pd.to_datetime(df['Localmax'])
df['date'] = df['Localmax'].dt.date

df_new = df.groupby(['symbol','date'])['dvol'].sum().reset_index()

df_new.index = df.groupby(['symbol','date'])['Localmax'].agg(max)

print(df_new)

输出:

                   symbol       dvol
Localmax                             
2016-10-19 17:30:00    st1  10172.159
2016-10-19 17:40:00    st2  13172.180

【讨论】:

  • 在创建 df_new 时我不应该指出“重新采样”的每日频率吗?
  • 如果有多个日期,它不会给出预期的结果。
【解决方案2】:

我认为应该有比这更好的简单方法,但这很好用:

In [58]: df
Out[58]: 
              Localmax symbol      dvol                  idx
0  2016-10-19 09:05:00    st1  5172.159  2016-10-19 09:05:00
1  2016-10-19 09:05:00    st2  5172.180  2016-10-19 09:05:00
2  2016-10-19 17:30:00    st1  5000.000  2016-10-19 17:30:00
3  2016-10-19 17:40:00    st2  8000.000  2016-10-19 17:40:00
4  2016-10-20 17:30:00    st1  6000.000  2016-10-19 17:30:00
5  2016-10-20 17:40:00    st2  9000.000  2016-10-19 17:40:00

In [59]: df['Localmax'] = pd.to_datetime(df['Localmax'])

In [60]: df['date'] = df['Localmax'].dt.date

In [61]: new_df = df.groupby(['date','symbol'],as_index=False)['dvol'].max()

In [62]: new_df['date'] = new_df.date.map(df.groupby(['date'])['Localmax'].max())

In [63]: new_df
Out[63]: 
                 date symbol      dvol
0 2016-10-19 17:40:00    st1  5172.159
1 2016-10-19 17:40:00    st2  8000.000
2 2016-10-20 17:40:00    st1  6000.000
3 2016-10-20 17:40:00    st2  9000.000

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 2020-08-18
    • 2018-04-25
    • 2018-08-07
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多