首页 > 解决方案 > 大熊猫的不同天数

问题描述

我有以下架构:

            H   T     datetime
    002599f58   A   2019-09-23
    002599f58   A   2019-09-23
    002599f58   A   2019-09-23
    002599f58   A   2019-09-26
    002599f58   C   2019-09-26
    005344fe8   C   2019-09-30
    005344fe8   D   2019-10-02
    005344fe8   D   2019-10-05

我需要做的是计算H在T中的不同天数。我试过了:

grouper = Grouper(key="datetime", freq="1D")
df = cdr.groupby(["H", "T", grouper])["datetime"].nunique().reset_index(name="numdays")

和其他类型,如size(). 我现在有 14 天,但是当我对值进行排序时,它们给了我大于 14 的数字,所以我知道这些是错误的,但我不知道为什么。

预期的输出是一个数据框

H           T   numdays
002599f58   A   2 (23 & 26)
002599f58   C   1 (26)
005344fe8   C   1 (30)
005344fe8   D   2 (02 & 05) 

它告诉我,对于每个不同的 H 和 T,H 在 T 中的不同天数,其中numdays不能大于 14(因为这是我拥有的所有天数)。我不需要括号中的数据,只是为了显示值的来源。

标签: pythonpandas

解决方案


我相信您需要删除Grouper并添加日期Series.dt.date

cdr['datetime'] = pd.to_datetime(cdr['datetime'])

cdr['dates'] = cdr['datetime'].dt.date
df = cdr.groupby(["H", "T"])["dates"].nunique().reset_index(name="numdays")
print (df)

           H  T  numdays
0  002599f58  A        2
1  002599f58  C        1
2  005344fe8  C        1
3  005344fe8  D        2

您可以通过将输出转换为列表来测试新旧解决方案:

print (cdr)
           H  T             datetime
0  002599f58  A  2019-09-23 12:45:10
1  002599f58  A  2019-09-23 02:45:10
2  002599f58  A  2019-09-23 12:45:50
3  002599f58  A  2019-09-26 12:25:10
4  002599f58  C  2019-09-26 10:45:10
5  005344fe8  C  2019-09-30 12:25:10
6  005344fe8  D  2019-10-02 12:45:00
7  005344fe8  D           2019-10-05

cdr['dates'] = cdr['datetime'].dt.date
print (cdr.groupby(["H", "T"])["dates"].apply(list))
H          T
002599f58  A    [2019-09-23, 2019-09-23, 2019-09-23, 2019-09-26]
           C                                        [2019-09-26]
005344fe8  C                                        [2019-09-30]
           D                            [2019-10-02, 2019-10-05]
Name: dates, dtype: object

grouper = pd.Grouper(key="datetime", freq="1D")
print (cdr.groupby(["H", "T", grouper])["datetime"].apply(list))
H          T  datetime  
002599f58  A  2019-09-23    [2019-09-23 12:45:10, 2019-09-23 02:45:10, 201...
              2019-09-26                                [2019-09-26 12:25:10]
           C  2019-09-26                                [2019-09-26 10:45:10]
005344fe8  C  2019-09-30                                [2019-09-30 12:25:10]
           D  2019-10-02                                [2019-10-02 12:45:00]
              2019-10-05                                [2019-10-05 00:00:00]
Name: datetime, dtype: object

推荐阅读