我正在尝试根据第一条记录和第二条记录之间的差异以及根据第二条记录从第二条记录到第三条记录之间的差异来创建新记录,依此类推。 pandas.diff()和pandas.shift()除了告诉我第一条记录和第二条记录之间的总天数差之外没有其他技巧。
由于发布的解决方案Creating new rows in df based on date range在我的数据集中没有结束日期,因此此处不起作用。
假设以下数据集:
df1=pd.DataFrame(columns=['Id','Code','Date'])
Ids=[1,1,1,2,2,2,2,3,3]
Codes=[8,9,11,5,6,7,8,7,8]
Dates=['2020-07-02','2020-06-16','2020-04-07',
'2020-02-19','2020-03-18','2020-05-02','2020-07-02',
'2020-05-19','2020-03-24']
df1.Id=Ids
df1.Code=Codes
df1.Date=Dates
Id Code Date
1 8 2020-07-02
1 9 2020-06-16
1 11 2020-04-07
2 5 2020-02-19
2 6 2020-03-18
2 7 2020-05-02
2 8 2020-07-02
3 7 2020-05-19
3 8 2020-03-24
我想要实现的结果是:
Id Code Date
1 8 2020-07-02
1 9 2020-06-16
1 11 2020-05-01
1 11 2020-04-07
2 5 2020-02-19
2 6 2020-03-18
2 7 2020-04-01
2 7 2020-05-02
2 8 2020-06-01
2 8 2020-07-02
3 7 2020-05-19
3 8 2020-04-01
3 11 2020-03-24
如您所见,对于日期和代码之间的每个缺失日期,都会创建一个新记录,该记录指定了两个记录之间的月份,并且在此新记录中,从其先前的记录中复制了代码的副本。
答案 0 :(得分:0)
我怀疑下面的方法是最优的,但是它能起作用。
df = pd.DataFrame(columns=['Id','Code','Date'])
for _, df_temp in df1.groupby(by=['Id'], axis=0):
df_temp = df_temp.sort_values(by=['Date']).reset_index(drop=True)
# impute values
dates = df_temp['Date']
for i in range(df_temp.shape[0] - 1):
date_range = [d.strftime('%Y-%m-%d') for d in pd.date_range(dates.loc[i], dates.loc[i+1], freq='M')]
new_rows = pd.DataFrame(columns=['Id','Code','Date'])
new_rows['Date'] = date_range
new_rows['Id'] = df_temp.loc[i, 'Id']
new_rows['Code'] = df_temp.loc[i, 'Code']
df = pd.concat([df, new_rows])
# take care of the last entry
df.loc[df.shape[0]] = df_temp.loc[df_temp.shape[0] - 1]