如何在Pandas中筛选英文月份缩写格式的特定月份行数据
筛选Pandas DataFrame中特定月份的行
我来帮你解决这个问题——用str.contains没得到预期结果,大概率是因为没用到最可靠的日期处理方式,或是你的测试数据刚好全是May,导致看起来没变化。下面给你两种可行方案,优先推荐第一种,因为后续处理日期也更方便:
方案一:将DATE列转为datetime类型(推荐)
把字符串格式的日期转为Pandas的datetime类型后,筛选月份会更准确,还能避免字符串匹配的各种坑(比如大小写、隐藏字符)。
转换日期列:
你的日期格式是dd-mon-yy(比如01-May-07),用pd.to_datetime指定格式解析:import pandas as pd df['DATE'] = pd.to_datetime(df['DATE'], format='%d-%b-%y')这里
%d对应两位日期,%b对应英文月份缩写(如May、Jun),%y对应两位年份(07会自动转为2007,17转为2017)。筛选特定月份:
可以用月份数字或月份名称两种方式筛选:- 用月份数字(5=May,6=Jun):
filtered_df = df[df['DATE'].dt.month.isin([5, 6])] - 用月份名称(注意是全称,
dt.month_name()返回完整月份名):filtered_df = df[df['DATE'].dt.month_name().isin(['May', 'June'])]
- 用月份数字(5=May,6=Jun):
方案二:直接对字符串列进行匹配(仅当无法转datetime时使用)
如果因为某些原因不能转换日期类型,可以用更精确的字符串匹配来筛选:
先确认DATE列是字符串类型:
print(df['DATE'].dtype) # 正常应该输出object用正则匹配中间的月份部分:
匹配-May-或-Jun-这样的子串,确保只匹配日期中的月份部分:filtered_df = df[df['DATE'].str.contains(r'-May-|-Jun-', regex=True)]或者提取中间的三个字母再筛选:
filtered_df = df[df['DATE'].str.extract(r'-(...)-')[0].isin(['May', 'Jun'])]
为什么你之前的方法没效果?
如果你的测试数据里全是May的行,那str.contains('May')当然会返回所有行,看起来和输入一致。如果实际数据有其他月份却没筛选出来,可能是DATE列不是字符串类型,或是字符串里有隐藏的空格/特殊字符导致匹配失败——这也是为什么转datetime是更稳妥的选择。
内容的提问来源于stack exchange,提问作者sundar_ima
相关产品推荐
相关产品推荐

