基于Datetime多级索引的月份查找Pandas单元格及分组数据访问
在Pandas中基于Datetime多级索引的月份查找单元格
针对你现在生成的这个多级索引DataFrame(dt为月度时间索引,rate为另一级索引),这里有几种实用的方法帮你按月份快速定位对应的consumption值:
方法1:用xs()(Cross Section)快速提取截面数据
xs()是Pandas处理多级索引的神器,能直接提取某一级或多级的截面数据,非常适配你的场景:
精确匹配某年月:因为你的
dt索引是每月最后一天,直接传入对应日期即可:# 获取2017年11月、rate为flat的consumption值 target_value = groups.xs(('2017-11-30', 'flat'), level=['dt', 'rate']) # 如果要提取该月所有rate的数据,只指定dt级别就行 november_2017_all = groups.xs('2017-11-30', level='dt')筛选所有同月份的数据(忽略年份):结合
dt.month属性来过滤:# 提取所有11月的数据,不管是哪一年 all_november_data = groups[groups.index.get_level_values('dt').dt.month == 11]
方法2:布尔索引灵活筛选
通过访问多级索引中dt级别的年份和月份属性,构建条件来精准筛选:
# 筛选2018年1月的所有数据 jan_2018_data = groups[(groups.index.get_level_values('dt').dt.year == 2018) & (groups.index.get_level_values('dt').dt.month == 1)] # 直接获取该月份flat对应的consumption值 jan_2018_flat_value = jan_2018_data.loc[('2018-01-31', 'flat'), 'consumption']
方法3:重置索引后按普通列筛选(适合新手)
如果觉得多级索引操作有点绕,可以先把索引转为普通列,再按常规方式筛选:
# 重置索引,dt和rate从索引变成普通列 groups_reset = groups.reset_index() # 筛选2017年12月、rate为flat的数据 dec_2017_flat = groups_reset[(groups_reset['dt'].dt.year == 2017) & (groups_reset['dt'].dt.month == 12) & (groups_reset['rate'] == 'flat')] # 取出对应的consumption值 dec_2017_value = dec_2017_flat['consumption'].iloc[0]
小提示
如果担心日期格式匹配问题(比如记不清每月最后一天的具体日期),可以先把dt转换为年月周期格式:
# 给DataFrame添加一个年月辅助列 groups['year_month'] = groups.index.get_level_values('dt').dt.to_period('M') # 直接按年月字符串筛选 target_data = groups[groups['year_month'] == '2017-11']
内容的提问来源于stack exchange,提问作者Darkstarone
相关产品推荐
相关产品推荐

