【问题标题】:Python: Create new rows based on difference between date values in one columnPython:根据一列中日期值之间的差异创建新行
【发布时间】:2020-10-14 16:46:51
【问题描述】:

我正在尝试根据第一个和第二个记录之间的差异创建新记录,以及从第二个到第三个,每个 Id 等等。 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

您可以看到,对于日期和代码之间的每个缺失日期,都会创建一条新记录,指定两条记录之间的月份,并且在这条新记录中,代码的副本是从其先前的记录制作的。

【问题讨论】:

    标签: python pandas date datetime


    【解决方案1】:

    我怀疑以下是最佳的,但它有效。

    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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 2023-01-12
      • 2019-06-07
      • 2017-08-31
      • 2021-11-10
      • 2019-09-21
      • 2021-02-15
      相关资源
      最近更新 更多