根据特定条件生成带有填充的行-熊猫

时间:2020-08-24 15:35:30

标签: python-3.x pandas dataframe

我有一个如下所示的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

1 个答案:

答案 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