对日期时间戳块进行重新采样/填充间隙

3

问题

我将一个包含时间间隔的csv文件转换成了dataframe - 样本频率为15分钟,每个datetimestamps都有一个三元素块。在这个例子中,datetime 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()
2个回答

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

1
你可以使用"重新采样(resample)",并且在单个时间戳有多个值的情况下使用"最后一个值(last)/平均值(average)"。
df.groupby('ID').resample('15min').last().fillna(0)

这将重新采样数据框,并为每个采样周期取最后一个值(大多数情况下应该是1或0个值),对于没有值但有索引(时间)的情况,它将插入0而不是“不适用”。请注意,只有当您拥有适当的索引类型时,此操作才能正常工作。我看到您正在解析日期,调用df.dtypes将允许您确保Datetime列具有有效的类型。如果计划基于时间执行许多/任何操作,则建议将索引设置为'Datetime'并大部分保留在那里。(即,在上述命令之前执行此操作!)
df.set_index('Datetime', inplace=True)

这将导致下面的新MultiIndex DataFrame。
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

如果你只需要Value系列,通过一些移动和调整,我们可以得到一个稍微不同的DataFrame,仅具有单个索引。这样做的好处是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

您的假设完全正确,我希望保留时间戳(请参见我的评论中的期望结果)。 - AS_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接