代码之家  ›  专栏  ›  技术社区  ›  Charles R

用pandas创建日期范围系列

  •  1
  • Charles R  · 技术社区  · 6 年前

    我有一个数据框,有几个人的开始日期和结束日期:

    # input df    
    df_input = pd.DataFrame([
            ["John", "2018-08-03", "2018-08-05"],
            ["Jack", "2018-08-20", "2018-08-21"]
    ])
    df_input.columns = ["name", "start_day", "finish_day"]
    

    我想为每个人创建一个日期范围(我想要一个包含日期范围的pd.series):

    # output df
    df_output = pd.DataFrame([
        ["John", "2018-08-03", "2018-08-05", "['2018-08-03', '2018-08-04', '2018-08-05']"],
        ["Jack", "2018-08-20", "2018-08-21", "['2018-08-20', '2018-08-21']"]
    ])
    df_output.columns = ["name", "start_day", "finish_day", "date_range"]
    

    我不知道如何创建这个范围。
    知道吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Nicola    6 年前

    挑逗又有趣!我认为下面的代码片段与您的要求非常接近,尽管它的形状与您要求的输出有点不同。然而,重新构造的输出形状确实包含日期范围、名称和结束日期。

    import pandas as pd
    df_input = pd.DataFrame([["John", "2018-08-03", "2018-08-05"],["Jack", "2018-08-20", "2018-08-21"]], columns=['Name','Start_Date','End_Date'])
    df_input['Start_Date'] =  pd.to_datetime(df_input['Start_Date'], format='%Y-%m-%d')
    df_input['End_Date'] =  pd.to_datetime(df_input['End_Date'], format='%Y-%m-%d')
    df_input.set_index('Start_Date', inplace=True)
    def reindex_by_date(df_input):
        dates = pd.date_range(df_input.index.min(), df_input['End_Date'].min())
        return df_input.reindex(dates).ffill()
    finaldf = df_input.groupby('Name').apply(reindex_by_date)
    finaldf