我有一个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
它以可用df的最后一行相同的值生成了直到2020-09-02的数据。
注意:
如果输入日期大于最大日期,则返回df1,否则返回df
假设日期是连续的,并且输入日期将始终大于数据框中可用的最小日期,则可以使用min
现有Date
列中的来创建date_range系列,然后right
合并并填充:
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)))
EDIT1:如果输入日期小于最小日期,则要调整并返回原始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
编辑2:
如果输入日期大于最大日期,则返回df1,否则返回df。
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
Date B_best B_worst W_best W_worst
0 2020-08-11 3 1 10 7
1 2020-08-12 3 1 10 7
2 2020-08-13 3 1 10 7
3 2020-08-14 3 1 10 7
4 2020-08-15 6 1 10 7
5 2020-08-16 6 2 10 11
6 2020-08-17 6 2 5 11
7 2020-08-18 6 2 5 11
8 2020-08-19 9 2 5 11
9 2020-08-20 9 2 4 11
10 2020-08-21 9 2 4 11
11 2020-08-22 5 3 7 13
12 2020-08-23 10 6 8 16
13 2020-08-24 9 2 4 11
14 2020-08-25 9 2 4 11
15 2020-08-26 9 2 4 11
16 2020-08-27 9 2 4 11
17 2020-08-28 9 2 4 11
18 2020-08-29 9 2 4 11
19 2020-08-30 9 2 4 11
20 2020-08-31 9 2 4 11
21 2020-09-01 9 2 4 11
22 2020-09-02 9 2 4 11
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句