重新取样/填补空白为日期时间邮票块(Resample/fill gaps for blocks of

2019-09-30 19:20发布

问题

我把CSV的数据帧,其中一些日期时间存在间隙 - 采样频率为15分钟,对于每个datetimestamps总是有三个值中的一个块。 在这个例子中为日期时间块2017-12-11 23:15:00缺失。

         ID           Datetime   Value
0        a 2017-12-11 23:00:00   20.0
1        b 2017-12-11 23:00:00   20.9
2        c 2017-12-11 23:00:00   21.0
3        a 2017-12-11 23:30:00   19.8
4        b 2017-12-11 23:30:00   20.8
5        c 2017-12-11 23:30:00   20.8

期望的结果

我想要做的是重新采样日期时间和填补国内空白的Value以零:

         ID           Datetime   Value
0        a 2017-12-11 23:00:00   20.0
1        b 2017-12-11 23:00:00   20.9
2        c 2017-12-11 23:00:00   21.0
3        a 2017-12-11 23:15:00   0.0
4        b 2017-12-11 23:15:00   0.0
5        c 2017-12-11 23:15:00   0.0
6        a 2017-12-11 23:30:00   19.8
7        b 2017-12-11 23:30:00   20.8
8        c 2017-12-11 23:30:00   20.8

我的问题

是否有可能以完成此resample()或者是一个可能的解决方案与组合groupby()

import pandas as pd

df = pd.concat((pd.read_csv(file, parse_dates=[1], dayfirst=True, 
                    names=headers)for file in all_files))
df.set_index("Datetime").resample('15min').fillna(0).reset_index()

Answer 1:

如果有一个单一的时间戳任意多个值可以使用重采样,并最后/平均。

df.groupby('ID').resample('15min').last().fillna(0)

这将重新取样数据帧,并采取的最后一个值针对每个采样周期的(应为1倍或0的值居多),以及用于在没有值的场合,但索引(时间),它将插入一个0,而不是一个不适用。

请注意,这只会如果您有合适的索引类型,我看你解析日期,调用df.dtypes将让你做出肯定的是,你有有效类型为datetime列工作。 我会建议指标设置为“日期时间”,留下它那里大多是如果做多/基于时间的任何操作计划。 ( 即上述命令之前做到这一点!)

df.set_index('Datetime', inplace=True)

这将导致新的多指标数据框下方

Out[76]: 
                       ID  Value
ID Datetime                     
a  2018-02-26 23:00:00  a   20.0
   2018-02-26 23:15:00  0    0.0
   2018-02-26 23:30:00  a   19.8
b  2018-02-26 23:00:00  b   20.9
   2018-02-26 23:15:00  0    0.0
   2018-02-26 23:30:00  b   20.8
c  2018-02-26 23:00:00  c   21.0
   2018-02-26 23:15:00  0    0.0
   2018-02-26 23:30:00  c   20.8

如果你只后的值系列的时候,有一点感动和震动,我们可以用一个稍微不同的数据帧最终只有一个单一的指标。 这具有在ID列不具有奇数值的益处(参见上文0)

(df.groupby('ID')['Value']
 .resample('15min')
 .last()
 .fillna(0)
 .reset_index()
 .set_index('Datetime')
 .sort_index())

Out[107]: 
                    ID  Value
Datetime                     
2018-02-26 23:00:00  a   20.0
2018-02-26 23:00:00  b   20.9
2018-02-26 23:00:00  c   21.0
2018-02-26 23:15:00  a    0.0
2018-02-26 23:15:00  b    0.0
2018-02-26 23:15:00  c    0.0
2018-02-26 23:30:00  a   19.8
2018-02-26 23:30:00  b   20.8
2018-02-26 23:30:00  c   20.8


Answer 2:

让我们用一些数据帧重塑然后resamplefillna ,再转换回原来的数据帧结构:

df_out = (df.set_index(['Datetime','ID'])
            .unstack()
            .resample('15T')
            .asfreq()
            .fillna(0)
            .stack()
            .reset_index())

输出:

             Datetime ID  Value
0 2017-12-11 23:00:00  a   20.0
1 2017-12-11 23:00:00  b   20.9
2 2017-12-11 23:00:00  c   21.0
3 2017-12-11 23:15:00  a    0.0
4 2017-12-11 23:15:00  b    0.0
5 2017-12-11 23:15:00  c    0.0
6 2017-12-11 23:30:00  a   19.8
7 2017-12-11 23:30:00  b   20.8
8 2017-12-11 23:30:00  c   20.8


文章来源: Resample/fill gaps for blocks of datetime stamps