用前一周(天)或前一天的数据填充 pandas 时间序列中的缺失数据?
fill missing data in pandas time series with data from the previous week(day) or day?
我从 CSV 导入的 pandas 数据框中有一系列数据,但此文件(每分钟采样)一整天都缺少数据。我想用前一天或星期几(7 天前)的相同数据替换它们,或者也用前几天或星期几(7 x n 天前)的每分钟平均值替换它们。
这应该用 pandas 或 python 完成,但坦率地说我不知道该怎么做,也许尝试重新采样或分组,然后以分钟频率再次重新采样?不过我不想更改所有数据..
文件如下所示:
...
------------------------
*previous complete data*
------------------------
2018-01-05 00:00:00,2900.41
2018-01-05 00:01:00,2919.24
2018-01-05 00:02:00,2938.07
..
2018-01-05 23:59:00,2994.57
-------------------
*missing days data*
-------------------
2018-01-08 00:00:00,3118.00
2018-01-08 00:01:00,3118.00
2018-01-08 00:02:00,3125.54
...
-------------------------------
*complete data till end of year*
-------------------------------
并且在输出中我想获得完整的完整数据集,用相同的 WEEKDAY(或 DAY BEFORE)值或平均值替换缺失值。因此,如果我用数据集前一天的值替换该值,数据集将如下所示:
...
------------------------
*previous complete data*
------------------------
2018-01-05 00:00:00,2900.41
2018-01-05 00:01:00,2919.24
2018-01-05 00:02:00,2938.07
...
2018-01-05 23:59:00,2994.57
2018-01-**06** 00:00:00,2900.41
2018-01-**06** 00:01:00,2919.24
2018-01-**06** 00:02:00,2938.07
...
2018-01-**06** 23:59:00,2994.57
......
2018-01-08 00:00:00,3118.00
2018-01-08 00:01:00,3118.00
2018-01-08 00:02:00,3125.54
...
-------------------------------
*complete data till end of year*
-------------------------------
感谢能提供帮助的人。
下面是用前一天的值填充缺失的日期时间的代码。
考虑样本输入
date val
0 2018-01-05 00:00:00 2900.41
1 2018-01-05 00:01:00 2919.24
2 2018-01-05 00:02:00 2938.07
3 2018-01-08 00:00:00 3118.00
4 2018-01-08 00:01:00 3118.00
5 2018-01-08 00:02:00 3125.54
现在我们正在尝试为相同的时间戳填充 2018.01.06 和 2018.01.07 的这些值。
df['date'] = pd.to_datetime(df.date)
df = df.set_index('date')
df = df.reindex(pd.date_range('2018-01-05 00:00:00',
'2018-01-08 00:02:00', freq='1 min')
).reset_index().rename(columns={'index':'date'})
df = df.groupby(df.date.dt.time).ffill()
输入时间的切片输出
date val
0 2018-01-05 00:00:00 2900.41
1 2018-01-05 00:01:00 2919.24
2 2018-01-05 00:02:00 2938.07
1440 2018-01-06 00:00:00 2900.41
1441 2018-01-06 00:01:00 2919.24
1442 2018-01-06 00:02:00 2938.07
2880 2018-01-07 00:00:00 2900.41
2881 2018-01-07 00:01:00 2919.24
2882 2018-01-07 00:02:00 2938.07
说明
- 我们首先将 'date' 列转换为时间戳。
- 将日期列设置为索引。
- 我们正在重新编制索引以填充缺失的日期,频率为 1 分钟,我将开始日期设为
'2018-01-05 00:00:00'
,结束日期设为 '2018-01-08 00:02:00'
,请根据您的要求进行修改。
- 由于现在有了所有时间戳,我们可以将索引重置为日期列。
- 我们现在将日期列与时间戳的时间部分分组并填充它。
我从 CSV 导入的 pandas 数据框中有一系列数据,但此文件(每分钟采样)一整天都缺少数据。我想用前一天或星期几(7 天前)的相同数据替换它们,或者也用前几天或星期几(7 x n 天前)的每分钟平均值替换它们。
这应该用 pandas 或 python 完成,但坦率地说我不知道该怎么做,也许尝试重新采样或分组,然后以分钟频率再次重新采样?不过我不想更改所有数据..
文件如下所示:
...
------------------------
*previous complete data*
------------------------
2018-01-05 00:00:00,2900.41
2018-01-05 00:01:00,2919.24
2018-01-05 00:02:00,2938.07
..
2018-01-05 23:59:00,2994.57
-------------------
*missing days data*
-------------------
2018-01-08 00:00:00,3118.00
2018-01-08 00:01:00,3118.00
2018-01-08 00:02:00,3125.54
...
-------------------------------
*complete data till end of year*
-------------------------------
并且在输出中我想获得完整的完整数据集,用相同的 WEEKDAY(或 DAY BEFORE)值或平均值替换缺失值。因此,如果我用数据集前一天的值替换该值,数据集将如下所示:
...
------------------------
*previous complete data*
------------------------
2018-01-05 00:00:00,2900.41
2018-01-05 00:01:00,2919.24
2018-01-05 00:02:00,2938.07
...
2018-01-05 23:59:00,2994.57
2018-01-**06** 00:00:00,2900.41
2018-01-**06** 00:01:00,2919.24
2018-01-**06** 00:02:00,2938.07
...
2018-01-**06** 23:59:00,2994.57
......
2018-01-08 00:00:00,3118.00
2018-01-08 00:01:00,3118.00
2018-01-08 00:02:00,3125.54
...
-------------------------------
*complete data till end of year*
-------------------------------
感谢能提供帮助的人。
下面是用前一天的值填充缺失的日期时间的代码。
考虑样本输入
date val
0 2018-01-05 00:00:00 2900.41
1 2018-01-05 00:01:00 2919.24
2 2018-01-05 00:02:00 2938.07
3 2018-01-08 00:00:00 3118.00
4 2018-01-08 00:01:00 3118.00
5 2018-01-08 00:02:00 3125.54
现在我们正在尝试为相同的时间戳填充 2018.01.06 和 2018.01.07 的这些值。
df['date'] = pd.to_datetime(df.date)
df = df.set_index('date')
df = df.reindex(pd.date_range('2018-01-05 00:00:00',
'2018-01-08 00:02:00', freq='1 min')
).reset_index().rename(columns={'index':'date'})
df = df.groupby(df.date.dt.time).ffill()
输入时间的切片输出
date val
0 2018-01-05 00:00:00 2900.41
1 2018-01-05 00:01:00 2919.24
2 2018-01-05 00:02:00 2938.07
1440 2018-01-06 00:00:00 2900.41
1441 2018-01-06 00:01:00 2919.24
1442 2018-01-06 00:02:00 2938.07
2880 2018-01-07 00:00:00 2900.41
2881 2018-01-07 00:01:00 2919.24
2882 2018-01-07 00:02:00 2938.07
说明
- 我们首先将 'date' 列转换为时间戳。
- 将日期列设置为索引。
- 我们正在重新编制索引以填充缺失的日期,频率为 1 分钟,我将开始日期设为
'2018-01-05 00:00:00'
,结束日期设为'2018-01-08 00:02:00'
,请根据您的要求进行修改。 - 由于现在有了所有时间戳,我们可以将索引重置为日期列。
- 我们现在将日期列与时间戳的时间部分分组并填充它。