我的数据帧有中断日期,如下所示:
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%
我怎么能以简单的方式做到这一点,谢谢!
答案 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%