【问题标题】:Pandas - Convert start date and end date to daily dates, but only every x-th week and certain daysPandas - 将开始日期和结束日期转换为每日日期,但仅每 x 周和某些天
【发布时间】:2021-06-14 17:24:45
【问题描述】:

我有类似one 的问题,但我无法根据我的问题调整解决方案。我只需要特定列为 True/1 的日子,这些日子只需要每 x 周。

我的数据集如下所示:

id | y1  | start      | end       | every x-th week | Mon | Tue | Wed | Thu | Fri | Sat | Sun
1  | 30  | 01-02-2021 | 10-03-2021|       2         | 1   | 0   | 1   | 0   | 0   | 0   | 0
2  | 50  | 01-02-2021 | 28-02-2021|       3         | 1   | 1   | 0   | 0   | 0   | 1   | 0
...
n  | 20  | 01-02-2021 | 28-02-2021|       1         | 1   | 0   | 0   | 1   | 0   | 0   | 0

我需要这种形式:

id | y1 | date      
1 | 30  | 01-02-2021 
1 | 30  | 03-02-2021
1 | 30  | 15-02-2021
1 | 30  | 17-02-2021
1 | 30  | 01-03-2021
1 | 30  | 08-03-2021

有人对此有解决方案吗?

【问题讨论】:

    标签: pandas date time-series


    【解决方案1】:

    如果我做对了,您希望将所有日期放在一列中,然后只保留那些满足经过周数条件的行 (every x week)。假设您的数据框看起来像这样(我使用了您的并复制了行并更改了一些):

     id  y1       start         end  every x weeks  Mon  Tue  Wed  Thu  Fri  \
    0    1  30  01-02-2021  10-03-2021              2    1    0    1    0    0   
    1    2  50  01-02-2021  28-02-2021              3    1    1    0    0    0   
    2    3  20  01-02-2021  28-02-2021              1    1    0    0    1    0   
    3    1  30  01-03-2021  10-03-2021              2    1    0    1    0    0   
    4    2  50  01-02-2021  28-02-2021              3    1    1    0    0    0   
    5    3  20  01-02-2021  28-02-2021              1    1    0    0    1    0   
    6    1  30  02-02-2021  10-03-2021              2    1    0    1    0    0   
    7    2  50  01-01-2021  28-02-2021              3    1    1    0    0    0   
    8    3  20  01-02-2021  28-02-2021              1    1    0    0    1    0   
    9    1  30  01-03-2021  10-03-2021              2    1    0    1    0    0   
    10   2  50  04-01-2021  28-02-2021              3    1    1    0    0    0   
    11   3  20  01-02-2021  28-02-2021              1    1    0    0    1    0   
    12   1  30  01-02-2021  10-03-2021              2    1    0    1    0    0   
    13   2  50  01-02-2021  28-02-2021              3    1    1    0    0    0   
    14   3  20  01-02-2021  28-02-2021              1    1    0    0    1    0   
    
        Sat  Sun  
    0     0    0  
    1     1    0  
    2     0    0  
    3     0    0  
    4     1    0  
    5     0    0  
    6     0    0  
    7     1    0  
    8     0    0  
    9     0    0  
    10    1    0  
    11    0    0  
    12    0    0  
    13    1    0  
    14    0    0  
    

    定义要堆叠的列(在您的情况下为 startend):

    keys = ['start','end']
    df2 = pd.melt(df, id_vars=['id','y1','every x weeks'], value_vars=keys, value_name='date')
    

    这给了你

       id  y1  every x weeks variable        date
    0    1  30              2    start  01-02-2021
    1    2  50              3    start  01-02-2021
    2    3  20              1    start  01-02-2021
    3    1  30              2    start  01-03-2021
    4    2  50              3    start  01-02-2021
    5    3  20              1    start  01-02-2021
    6    1  30              2    start  02-02-2021
    7    2  50              3    start  01-01-2021
    8    3  20              1    start  01-02-2021
    9    1  30              2    start  01-03-2021
    10   2  50              3    start  04-01-2021
    11   3  20              1    start  01-02-2021
    12   1  30              2    start  01-02-2021
    13   2  50              3    start  01-02-2021
    14   3  20              1    start  01-02-2021
    15   1  30              2      end  10-03-2021
    16   2  50              3      end  28-02-2021
    17   3  20              1      end  28-02-2021
    18   1  30              2      end  10-03-2021
    19   2  50              3      end  28-02-2021
    20   3  20              1      end  28-02-2021
    21   1  30              2      end  10-03-2021
    22   2  50              3      end  28-02-2021
    23   3  20              1      end  28-02-2021
    24   1  30              2      end  10-03-2021
    25   2  50              3      end  28-02-2021
    26   3  20              1      end  28-02-2021
    27   1  30              2      end  10-03-2021
    28   2  50              3      end  28-02-2021
    29   3  20              1      end  28-02-2021
    

    现在,你可以选择你想要的任何星期

        id  y1  every x weeks variable        date
    1    2  50              3    start  01-02-2021
    4    2  50              3    start  01-02-2021
    7    2  50              3    start  01-01-2021
    10   2  50              3    start  04-01-2021
    13   2  50              3    start  01-02-2021
    16   2  50              3      end  28-02-2021
    19   2  50              3      end  28-02-2021
    22   2  50              3      end  28-02-2021
    25   2  50              3      end  28-02-2021
    28   2  50              3      end  28-02-2021
    

    如果您想要所有其他列,请将它们添加到 id_vars

    【讨论】:

    • 抱歉,我刚刚注意到我描述的问题有误。我刚刚编辑了它,所以它应该更清楚。感谢您的帮助,对我的错误深表歉意。
    猜你喜欢
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2020-10-05
    • 2012-08-19
    • 1970-01-01
    • 2022-01-23
    • 2019-12-11
    相关资源
    最近更新 更多