我有以下架构:
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