通过在熊猫中复制以前的日期记录填写缺失的日期记录

时间:2017-08-19 19:14:52

标签: python pandas dataframe

我的数据帧有中断日期,如下所示:

Date         Value
2015-10-23   75%
2015-08-25   50%
2015-02-20   30%

我想通过将最近的较低日期记录复制到当前日期来填充缺失的数据记录,例如:

Date         Value
2017-08-20   75%
...          75% 
2015-10-24   75%
2015-10-23   75%
2015-10-22   50%
...          50%
2015-08-26   50%
2015-08-25   50%
2015-08-24   30%
...          30%
2015-02-21   30%
2015-02-20   30%

我怎么能以简单的方式做到这一点,谢谢!

3 个答案:

答案 0 :(得分:2)

你可以简单地

    根据您想要的频率
  • resample:今天1D
  • 根据您想要的方法填充缺失值:此处pad向前填充值,以便在每个时间点都可以使用“最后一个已知值”。

这可以在一行代码中完成。

import io
import pandas as pd

# Test data
zz = """Date         Value
2015-10-23   75%
2015-08-25   50%
2015-02-20   30%
"""     
df = pd.read_table(io.StringIO(zz), delim_whitespace=True)
df['Date'] = pd.to_datetime(df['Date'])
# Setting date as the index
df.set_index('Date', inplace=True)

# Resampling and filling missing values
df.resample('1D').pad()

#            Value
# Date            
# 2015-02-20   30%
# 2015-02-21   30%
# 2015-02-22   30%
# 2015-02-23   30%
# 2015-02-24   30%

答案 1 :(得分:0)

这应该这样做:

import pandas as pd
from datetime import timedelta
from datetime import datetime

df = pd.DataFrame.from_dict({'Date': ['2015-10-23','2015-08-25', '2015-02-20'],
                             'values': [75,50,30]})

df['Date'] = pd.to_datetime(df['Date'])
df

输出:

    Date    values
0   2015-10-23  75
1   2015-08-25  50
2   2015-02-20  30

创建另一个包含所有日期的数据框。

min_val = df['Date'].min()
max_val = df['Date'].max()

all_val = []
while min_val <= max_val:
    all_val.append(min_val)
    min_val += timedelta(days=1)

df_new = pd.DataFrame.from_dict({'Date': all_val})

df_new

输出:

    Date
0   2015-02-20
1   2015-02-21
2   2015-02-22

然后合并两个数据帧,以便原始数据帧中的所有缺失值都在

df_final = df_new.merge(df, on='Date', how='outer')

最后向前填充数据框。即:填写缺失的数据记录,将最近的较低日期记录复制到当前日期

df_final.ffill(inplace=True)

df_final

    Date      values
0   2015-02-20  30.0
1   2015-02-21  30.0
2   2015-02-22  30.0

我在几天前给出了一个非常相似的答案:https://stackoverflow.com/a/45759989/3027854

答案 2 :(得分:0)

或者您只需使用reindex

即可
idx=pd.date_range(start='2015-02-20',end='2015-10-23', freq='D')
df=df.set_index(df.Date,drop=True)
df.reindex(idx).ffill().sort_index(ascending=False).drop('Date',1).reset_index().\
                rename(columns={'index':'Date'})


Out[304]: 
          Date Value
0   2015-10-23   75%
1   2015-10-22   50%
2   2015-10-21   50%
3   2015-10-20   50%
4   2015-10-19   50%
5   2015-10-18   50%
6   2015-10-17   50%
7   2015-10-16   50%
8   2015-10-15   50%
9   2015-10-14   50%
10  2015-10-13   50%
11  2015-10-12   50%
12  2015-10-11   50%
13  2015-10-10   50%
14  2015-10-09   50%
15  2015-10-08   50%
16  2015-10-07   50%
17  2015-10-06   50%
18  2015-10-05   50%
19  2015-10-04   50%
20  2015-10-03   50%
21  2015-10-02   50%
22  2015-10-01   50%
23  2015-09-30   50%
24  2015-09-29   50%
25  2015-09-28   50%
26  2015-09-27   50%
27  2015-09-26   50%
28  2015-09-25   50%
29  2015-09-24   50%