我有一个如下所示的df
Date B_best B_worst W_best W_worst
2020-08-11 3 1 10 7
2020-08-12 3 1 10 7
2020-08-13 3 1 10 7
2020-08-14 3 1 10 7
2020-08-15 6 1 10 7
2020-08-16 6 2 10 11
2020-08-17 6 2 5 11
2020-08-18 6 2 5 11
2020-08-19 9 2 5 11
2020-08-20 9 2 4 11
2020-08-21 9 2 4 11
2020-08-22 5 3 7 13
2020-08-23 10 6 8 16
2020-08-24 9 2 4 11
在df上方,上面有一个名为Date
的列,我希望有一个函数,其输入将在df之上,并带有日期值
df1 = generate_data(df, datetime.datetime(2020, 9, 2, 20, 0))
其中datetime.datetime(2020,9,2,20,0)表示2020-09-02
预期产量
df1:
Date B_best B_worst W_best W_worst
2020-08-11 3 1 10 7
2020-08-12 3 1 10 7
2020-08-13 3 1 10 7
2020-08-14 3 1 10 7
2020-08-15 6 1 10 7
2020-08-16 6 2 10 11
2020-08-17 6 2 5 11
2020-08-18 6 2 5 11
2020-08-19 9 2 5 11
2020-08-20 9 2 4 11
2020-08-21 9 2 4 11
2020-08-22 5 3 7 13
2020-08-23 10 6 8 16
2020-08-24 9 2 4 11
2020-08-25 9 2 4 11
2020-08-26 9 2 4 11
2020-08-27 9 2 4 11
2020-08-28 9 2 4 11
2020-08-29 9 2 4 11
2020-08-30 9 2 4 11
2020-08-31 9 2 4 11
2020-09-01 9 2 4 11
2020-09-02 9 2 4 11
它已经生成了直到2020-09-02的数据,其可用df的最后一行的值相同。
注意:
如果输入日期大于最大日期,则返回df1,否则返回df
答案 0 :(得分:3)
假设日期是连续的,并且输入日期将始终大于数据框中可用的最小日期,则可以使用现有min
列中的Date
创建date_range系列,然后使用{ {1}}合并,然后填充:
right
EDIT1: 要调整并返回原始df(如果输入日期小于最小日期),则可以编辑该功能:
def generate_data(a,b):
idx = pd.date_range(a['Date'].min(),b)
return a.merge(pd.Series(idx,name='Date'),how='right').ffill().astype(a.dtypes)
print(generate_data(df, datetime.datetime(2020, 9, 2, 20, 0)))
EDIT2:
如果输入日期大于最大日期,则返回df1,否则返回df。
def generate_data(a,b):
idx = pd.date_range(a['Date'].min(),b)
out = a.merge(pd.Series(idx,name='Date'),how='right').ffill().astype(a.dtypes)
return a if b<a['Date'].min() else out
def generate_data(df, b):
if df['Date'].max() < b:
idx = pd.date_range(df['Date'].min(),b)
return df.merge(pd.Series(idx,name='Date'),how='right').ffill().astype(df.dtypes)
else:
return df