Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python中前一周(天)的当天和时间的值来插补时间序列数据中的缺失值_Python_Pandas_Time Series_Missing Data - Fatal编程技术网

如何使用python中前一周(天)的当天和时间的值来插补时间序列数据中的缺失值

如何使用python中前一周(天)的当天和时间的值来插补时间序列数据中的缺失值,python,pandas,time-series,missing-data,Python,Pandas,Time Series,Missing Data,我有一个带有时间戳和能量使用列的数据帧。一天中每分钟取一次时间戳,即每天总共读取1440次读数。我在数据框中缺少几个值 我想用过去两三周的同一天、同一时间的平均值来估算这些缺失的值。这样,如果前一周也缺失,我可以使用两周前的值 下面是一个数据示例: mains_1 timestamp 2013-01-03 00:00:00 155.00 2013-01-03 00:01:00 154.00 2013-01-03 00:02:00 NaN 2013-0

我有一个带有时间戳和能量使用列的数据帧。一天中每分钟取一次时间戳,即每天总共读取1440次读数。我在数据框中缺少几个值

我想用过去两三周的同一天、同一时间的平均值来估算这些缺失的值。这样,如果前一周也缺失,我可以使用两周前的值

下面是一个数据示例:

                    mains_1
timestamp   
2013-01-03 00:00:00 155.00
2013-01-03 00:01:00 154.00
2013-01-03 00:02:00 NaN
2013-01-03 00:03:00 154.00
2013-01-03 00:04:00 153.00
... ...
2013-04-30 23:55:00 NaN
2013-04-30 23:56:00 182.00
2013-04-30 23:57:00 181.00
2013-04-30 23:58:00 182.00
2013-04-30 23:59:00 182.00
现在我有一行代码:

df['mains_1'] = (df
    .groupby((df.index.dayofweek * 24) + (df.index.hour) + (df.index.minute / 60))
    .transform(lambda x: x.fillna(x.mean()))
)

因此,它使用的是整个数据集上一天中同一小时的平均使用率。我希望它更精确,并使用过去两周或三周的平均值。

您可以将
concat
系列与
shift
一起循环,因为索引对齐将确保它与前几周相同的时间相匹配。然后取
平均值
并使用
.fillna
更新原始值

样本数据
代码

谢谢你的帮助。当我试图计算序列时,我得到了这样一个错误:
传递值的形状是(332640,4),索引意味着(182880,4)
同样,这个方法是否考虑了分钟?正如我所提到的,我的时间序列分辨率是1分钟。@AshkanLotfipoor它确实需要考虑分钟和秒,因为索引对齐需要精确匹配,我们只是在日期上增加7天,包括时间。我不确定是否有错误,也许你有重复的,这会把事情搞砸?谢谢,我找到了。它工作得很好。
import pandas as pd
import numpy as np

np.random.seed(5)
df = pd.DataFrame(index=pd.date_range('2010-01-01 10:00:00', freq='W', periods=10),
                  data = np.random.choice([1,2,3,4, np.NaN], 10),
                  columns=['mains_1'])
#                     mains_1
#2010-01-03 10:00:00      4.0
#2010-01-10 10:00:00      1.0
#2010-01-17 10:00:00      2.0
#2010-01-24 10:00:00      1.0
#2010-01-31 10:00:00      NaN
#2010-02-07 10:00:00      4.0
#2010-02-14 10:00:00      1.0
#2010-02-21 10:00:00      1.0
#2010-02-28 10:00:00      NaN
#2010-03-07 10:00:00      2.0
# range(4) for previous 3 weeks. 
df1 = pd.concat([df.shift(periods=x, freq='W') for x in range(4)], axis=1)
#                     mains_1  mains_1  mains_1  mains_1
#2010-01-03 10:00:00      4.0      NaN      NaN      NaN
#2010-01-10 10:00:00      1.0      4.0      NaN      NaN
#2010-01-17 10:00:00      2.0      1.0      4.0      NaN
#2010-01-24 10:00:00      1.0      2.0      1.0      4.0
#2010-01-31 10:00:00      NaN      1.0      2.0      1.0
#2010-02-07 10:00:00      4.0      NaN      1.0      2.0
#2010-02-14 10:00:00      1.0      4.0      NaN      1.0
#2010-02-21 10:00:00      1.0      1.0      4.0      NaN
#2010-02-28 10:00:00      NaN      1.0      1.0      4.0
#2010-03-07 10:00:00      2.0      NaN      1.0      1.0
#2010-03-14 10:00:00      NaN      2.0      NaN      1.0
#2010-03-21 10:00:00      NaN      NaN      2.0      NaN
#2010-03-28 10:00:00      NaN      NaN      NaN      2.0

df['mains_1'] = df['mains_1'].fillna(df1.mean(axis=1))
print(df)

                      mains_1
2010-01-03 10:00:00  4.000000
2010-01-10 10:00:00  1.000000
2010-01-17 10:00:00  2.000000
2010-01-24 10:00:00  1.000000
2010-01-31 10:00:00  1.333333
2010-02-07 10:00:00  4.000000
2010-02-14 10:00:00  1.000000
2010-02-21 10:00:00  1.000000
2010-02-28 10:00:00  2.000000
2010-03-07 10:00:00  2.000000