使用Pandas按天分组DateTimeIndex并统计日期出现频次
统计DateTimeIndex中每日数据频次的实现方法
嘿,这问题我刚好处理过,先确认下你的场景:你已经把DataFrame的索引设置成了DateTimeIndex,数据大概长这样:
timestamp _id 2018-05-09 16:56:40.940 somedata1 2018-05-09 16:54:03.959 somedata2 2018-05-10 16:53:42.975 somedata3 2018-05-11 16:52:44.897 somedata4 2018-05-11 16:46:35.902 somedata5
你想要统计每个日期的出现频次,得到这样的结果:
day count 2018-05-09 2 2018-05-10 1 2018-05-11 2
给你两种简单的实现方法,都能轻松搞定:
方法一:用value_counts()快速统计
这种方法步骤简洁,先提取日期部分再统计:
# 从DateTimeIndex中提取日期,统计每个日期的出现次数并按日期排序 daily_counts = df.index.date.value_counts().sort_index() # 转换成DataFrame并设置列名 result_df = daily_counts.reset_index() result_df.columns = ['day', 'count']
df.index.date会把每个时间戳转换成纯日期对象(比如2018-05-09)value_counts()自动统计每个日期的出现频次sort_index()确保结果按日期先后顺序排列,避免乱序- 最后用
reset_index()把统计结果的索引转成列,再重命名成你需要的day和count
方法二:用groupby()分组统计
如果你习惯用分组的思路,也可以这么写:
# 按日期分组,计算每组的大小(即频次) result_df = df.groupby(df.index.date).size().reset_index(name='count') # 重命名第一列 result_df.columns = ['day', 'count']
groupby(df.index.date)按日期对数据分组size()返回每组的行数,也就是该日期的出现次数reset_index(name='count')直接把统计结果转成DataFrame并设置第二列的列名,最后再重命名第一列即可
两种方法都能得到你想要的结果,选哪种全看你个人习惯~
内容的提问来源于stack exchange,提问作者timothyylim
相关产品推荐
相关产品推荐

