问题
我把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()
如果有一个单一的时间戳任意多个值可以使用重采样,并最后/平均。
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
让我们用一些数据帧重塑然后resample
和fillna
,再转换回原来的数据帧结构:
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