【问题标题】:Pandas: cut date column into period date groups/bins熊猫:将日期列切割成期间日期组/箱
【发布时间】:2021-08-31 20:25:45
【问题描述】:

我有一个如下的数据框:

df = pd.DataFrame({'Id': ['abs1', 'abs2', 'abs3', 'plo2', '201805', '201806', '202011', 'pctx1'],
                   'Date': ['2021-06-15', '2021-06-13', '2021-06-07', '2021-05-30',
                            '2021-05-12', '2021-04-28', '2021-04-15', '2021-02-01']})

我希望将Date列分成几组在一个新列中,称为Date_Bin,规则是:从今天开始,如果Date中的值小于7天,那么新列中的值将是'last 7 days',如果该值小于 14 天且大于 7 天,则该值为“7 到 14 天”,如果该值小于 30 天且大于 14 天,则该值为'14 到 30 天',30 到 60 天、60 到 90 天和 90 天以上的逻辑相同。 理想的输出是这样的:

       Id        Date           Date_Bin
0    abs1  2021-06-15        last 7 days
1    abs2  2021-06-13        last 7 days
2    abs3  2021-06-07       7 to 14 days
3    plo2  2021-05-30      14 to 30 days
4  201805  2021-05-10      30 to 60 days
5  201806  2021-04-28      30 to 60 days
6  202011  2021-04-15      60 to 90 days
7   pctx1  2021-02-01  more than 90 days

正如您所看到的输出,这些是我需要的数据的唯一组/箱。试了好几种方法都不行,如果有大神帮忙,不胜感激。

【问题讨论】:

    标签: pandas datetime pandas-groupby pandas-timeindex


    【解决方案1】:

    to_datetime 转换您的日期,然后从今天的normalized 日期中减去(这样我们就可以删除时间部分)并得到天数。然后使用pd.cut 对它们进行适当的分组。

    未来的任何东西都会被标记为NaN

    import pandas as pd
    import numpy as np
    
    df['Date'] = pd.to_datetime(df['Date'])
    s =  (pd.to_datetime('today').normalize() - df['Date']).dt.days
    
    df['Date_Bin'] = pd.cut(s, [0, 7, 14, 30, 60, 90, np.inf],
                            labels=['last 7 days', '7 to 14 days', '14 to 30 days',
                                    '30 to 60 days', '60 to 90 days', 'more than 90 days'],
                            include_lowest=True)
    

    print(df)
    
           Id       Date           Date_Bin
    0    abs1 2021-06-15        last 7 days
    1    abs2 2021-06-13        last 7 days
    2    abs3 2021-06-07       7 to 14 days
    3    plo2 2021-05-30      14 to 30 days
    4  201805 2021-05-12      30 to 60 days
    5  201806 2021-04-28      30 to 60 days
    6  202011 2021-04-15      60 to 90 days
    7   pctx1 2021-02-01  more than 90 days
    

    为了将来的可重复性,在撰写本文时:

    pd.to_datetime('today').normalize()
    #Timestamp('2021-06-15 00:00:00')
    

    【讨论】:

    • 非常感谢@ALollz,太好了,我也从你那里学到了,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2016-07-05
    • 2020-12-01
    • 2013-10-26
    • 1970-01-01
    相关资源
    最近更新 更多