【问题标题】:Counting total occurences and occurences by category based on date ranges根据日期范围按类别计算总出现次数和出现次数
【发布时间】:2021-03-06 21:23:02
【问题描述】:

在下表中,开始日期和结束日期表示计算唯一标识符的时间段。我的目标是计算唯一标识符在日期之间出现的次数,但每月显示一次。我还想计算一个类别在该日期范围内出现的次数。

我是处理表格数据和熊猫的新手,所以我有点迷茫。非常感谢您的帮助。

输入数据示例:

Start Date End Date Unique Identifyer Category
2019-04-17 2020-04-17 ID 1234 A
2019-05-20 2021-04-03 ID 3492 B
2019-05-20 2021-04-03 ID 7376 C
2019-04-18 2021-04-03 ID 9813 A
2019-06-20 2021-04-03 ID 6342 A
2019-06-20 2021-04-03 ID 6455 B
2019-07-20 2021-04-03 ID 6342 A
2019-06-20 2021-04-03 ID 6455 B
etc... etc... etc... etc...

输出示例:

Date Total_Vol count_A count_B count_c
Apr-2019 2 2 0 0
May-2019 4 2 1 1
Jun-2019 7 3 3 1
Jul-2019 8 4 3 1

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    首先我建议将日期列拆分为两个不同的列yearmonth,以便您可以按它们进行分组。

    df = (pd.DataFrame(records, columns=['start', 'end', 'id', 'cat'])
             .astype({'start':'datetime64', 'end':'datetime64'})
             .assign(year=lambda x: x['start'].dt.year)
             .assign(month=lambda x: x['start'].dt.month))
    

    那你可以把cat这个列炸开,方便计算

    df_cats = (pd
     .get_dummies(df['cat'], prefix='count')
     .assign(total = lambda r: r['count_A']+r['count_B']+r['count_C']))
    

    你会得到

    现在您只需合并两个 dfs 并使用 groupby.sum() 即可获得结果

    pd.merge(df, df_cats, left_index=True, right_index=True).groupby(['year', 'month'].sum()
    

    你最终会得到

    【讨论】:

    • 感谢 Bertrand,这真的很有帮助。珍惜你的时间。虽然这真的很接近我正在寻找的东西,但我认为我在最初的问题中并不清楚其中的一部分。我按照您的代码得到了正确的输出,但是我需要进行修改。当类别(和类别总和)发生在开始日期和结束日期之间时,我需要计算每年/每月的类别(和类别总和),而不仅仅是开始日期。所以实际上,它会从开始日期开始计算相同的类别,并一直计数到结束日期
    • 也许 datetime 的 timedelta 会对此有所帮助?
    • 哦,对不起,我错过了这一点...不确定这是否是最有效的解决方案,但您可以想象用一个会占用每个月价值的单个列替换您的开始/结束列在开始和结束之内。在您感兴趣的范围内,您每个月都会获得一个新行
    猜你喜欢
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2017-03-19
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多