簡體   English   中英

向 pandas dataframe 添加新列,並在組內增加日期

[英]Add a new column to pandas dataframe with increment dates within groups

我有一個按索引值分組的 pandas dataframe (df)。 有重復的行。

我想為每一行添加一個包含日期的新列,代表每個組的 df.start_date 和 df.end_date 中的每一天:

由此:

index    start_date   end_date    number_of_days  value
0        8/12/2019    10/12/2019  3               2091
0        8/12/2019    10/12/2019  3               2091
0        8/12/2019    10/12/2019  3               2091
1        11/12/2019   14/12/2019  4               2214
1        11/12/2019   14/12/2019  4               2214
1        11/12/2019   14/12/2019  4               2214
1        11/12/2019   14/12/2019  4               2214
2        15/12/2019   16/12/2019  2               8430
2        15/12/2019   16/12/2019  2               8430

對此:

index    start_date   end_date    number_of_days  value  NEW_COLUMN
0        8/12/2019    10/12/2019  3               2091   8/12/2019
0        8/12/2019    10/12/2019  3               2091   9/12/2019
0        8/12/2019    10/12/2019  3               2091   10/12/2019
1        11/12/2019   14/12/2019  4               2214   11/12/2019
1        11/12/2019   14/12/2019  4               2214   12/12/2019 
1        11/12/2019   14/12/2019  4               2214   13/12/2019
1        11/12/2019   14/12/2019  4               2214   14/12/2019
2        15/12/2019   16/12/2019  2               8430   15/12/2019
2        15/12/2019   16/12/2019  2               8430   16/12/2019

到目前為止,我已經能夠基於 pd.date_range 創建一個日期范圍,然后嘗試將該范圍作為新值添加到 dataframe..

#generate a daily date range based on min and max values
date_range_to_add = pd.date_range(start=min(df['start_date'])
                                  ,end=max(df['end_date']),freq='D')

repeated_dw_data['dates']= date_range_to_add

但是,我得到的錯誤是值的長度與索引的長度不匹配。 顯然,生成的日期范圍比完整的行列表短。

我想我將不得不創建一個 function 來為每個組生成一個日期范圍,添加它,然后將 append 分組到一個新的 dataframe 中。 但是在我走這條路之前,我有什么遺漏的更簡單的路線嗎? 對每個組進行交互並應用此邏輯的最佳方法是什么?

如果每個索引值的每個組的長度與number_of_days列解決方案相同,則應通過GroupBy.cumcountto_timedelta計數器創建天的時間增量並添加到start_date列:

repeated_dw_data['start_date']=pd.to_datetime(repeated_dw_data['start_date'], dayfirst=True)

td = pd.to_timedelta(repeated_dw_data.groupby(level=0).cumcount(), unit='d')
repeated_dw_data['new'] = repeated_dw_data['start_date'] + td
print (repeated_dw_data)
      start_date    end_date  number_of_days  value        new
index                                                         
0     2019-12-08  10/12/2019               3   2091 2019-12-08
0     2019-12-08  10/12/2019               3   2091 2019-12-09
0     2019-12-08  10/12/2019               3   2091 2019-12-10
1     2019-12-11  14/12/2019               4   2214 2019-12-11
1     2019-12-11  14/12/2019               4   2214 2019-12-12
1     2019-12-11  14/12/2019               4   2214 2019-12-13
1     2019-12-11  14/12/2019               4   2214 2019-12-14
2     2019-12-15  16/12/2019               2   8430 2019-12-15
2     2019-12-15  16/12/2019               2   8430 2019-12-16

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM