从特定日期开始 pandas 分档
Binning in pandas starting from specific date
我正在尝试根据日期对值进行分类。数据框看起来像这样
type event_date
43851 MEDIUM 2017-10-09 13:28:33
43852 HIGH 2017-10-09 14:19:49
43853 HIGH 2017-10-09 14:23:25
43854 HIGH 2017-10-09 14:24:18
43855 MEDIUM 2017-10-09 14:25:31
43856 LOW 2017-10-09 14:25:33
43857 MEDIUM 2017-10-09 14:25:33
43858 LOW 2017-10-09 14:25:38
我想从特定日期开始分类,并每半小时计算一次 type
的出现次数。我试过
grouper = df.groupby([pd.Grouper(freq='30T',key='event_date'), 'type'])
grouper['other_col'].count()
几乎完全符合我的要求
event_date type
2017-10-09 13:00:00 MEDIUM 1
2017-10-09 14:00:00 HIGH 3
LOW 2
MEDIUM 2
我愿意
- 从指定的小时开始(在我的例子中,它将是
LOW
- 12 小时 = 02:25:33 的第一次出现),而不是向下舍入的第一个可用小时。
- 也显示空区间
您可以使用pd.cut
starting_hour = (df[df.type=='LOW'].head(1).event_date - dt.timedelta(hours=12)).item()
intervals = pd.cut(df.event_date, pd.date_range(start=starting_hour , freq='30T', periods=49))
43851 (2017-10-09 13:25:33, 2017-10-09 13:55:33]
43852 (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43853 (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43854 (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43855 (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43856 (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43857 (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43858 (2017-10-09 14:25:33, 2017-10-09 14:55:33]
要仅包含左值,您可以
df['i'] = intervals.transform(lambda k: k.left)
43851 2017-10-09 13:25:33
43852 2017-10-09 13:55:33
43853 2017-10-09 13:55:33
43854 2017-10-09 13:55:33
43855 2017-10-09 13:55:33
43856 2017-10-09 13:55:33
43857 2017-10-09 13:55:33
43858 2017-10-09 14:25:33
然后你可以按间隔分组并使用count()
df.groupby(['i', 'type']).count()
请注意,您使用的是 30 分钟间隔,因此会有很多空行。
我正在尝试根据日期对值进行分类。数据框看起来像这样
type event_date
43851 MEDIUM 2017-10-09 13:28:33
43852 HIGH 2017-10-09 14:19:49
43853 HIGH 2017-10-09 14:23:25
43854 HIGH 2017-10-09 14:24:18
43855 MEDIUM 2017-10-09 14:25:31
43856 LOW 2017-10-09 14:25:33
43857 MEDIUM 2017-10-09 14:25:33
43858 LOW 2017-10-09 14:25:38
我想从特定日期开始分类,并每半小时计算一次 type
的出现次数。我试过
grouper = df.groupby([pd.Grouper(freq='30T',key='event_date'), 'type'])
grouper['other_col'].count()
几乎完全符合我的要求
event_date type
2017-10-09 13:00:00 MEDIUM 1
2017-10-09 14:00:00 HIGH 3
LOW 2
MEDIUM 2
我愿意
- 从指定的小时开始(在我的例子中,它将是
LOW
- 12 小时 = 02:25:33 的第一次出现),而不是向下舍入的第一个可用小时。 - 也显示空区间
您可以使用pd.cut
starting_hour = (df[df.type=='LOW'].head(1).event_date - dt.timedelta(hours=12)).item()
intervals = pd.cut(df.event_date, pd.date_range(start=starting_hour , freq='30T', periods=49))
43851 (2017-10-09 13:25:33, 2017-10-09 13:55:33]
43852 (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43853 (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43854 (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43855 (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43856 (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43857 (2017-10-09 13:55:33, 2017-10-09 14:25:33]
43858 (2017-10-09 14:25:33, 2017-10-09 14:55:33]
要仅包含左值,您可以
df['i'] = intervals.transform(lambda k: k.left)
43851 2017-10-09 13:25:33
43852 2017-10-09 13:55:33
43853 2017-10-09 13:55:33
43854 2017-10-09 13:55:33
43855 2017-10-09 13:55:33
43856 2017-10-09 13:55:33
43857 2017-10-09 13:55:33
43858 2017-10-09 14:25:33
然后你可以按间隔分组并使用count()
df.groupby(['i', 'type']).count()
请注意,您使用的是 30 分钟间隔,因此会有很多空行。