我有以下架构:

            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(因为我拥有的所有天数)。我不需要paren中的数据,只需在那里显示值的来源。

最佳答案

我相信您需要删除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

10-07 19:12
查看更多