如何在Pandas中筛选每年1月1日至2月9日的销售数据
用Pandas筛选每年1月1日至2月9日的销售数据
嘿,这个需求在Pandas里实现起来很直观,我给你拆解成几个简单步骤,还有几种不同的实现方式供你选择:
第一步:确保日期字段是datetime类型
首先得保证你的Date列是Pandas能识别的datetime格式,不然没法提取月日信息。如果原始数据是字符串格式,先转换:
import pandas as pd # 假设你的数据存储在DataFrame df中 df['Date'] = pd.to_datetime(df['Date']) # 如果日期格式不是默认的(比如是'YYYY/MM/DD'),可以指定format参数 # df['Date'] = pd.to_datetime(df['Date'], format='%Y/%m/%d')
第二步:筛选目标日期范围
这里有三种常用的实现方式,你可以根据自己的习惯选:
方式一:拆分月和日进行逻辑判断
直接通过dt.month和dt.day提取日期的月、日部分,组合筛选条件:
filtered_df = df[ # 匹配1月的所有日期 (df['Date'].dt.month == 1) | # 匹配2月1日至9日的日期 ((df['Date'].dt.month == 2) & (df['Date'].dt.day <= 9)) ]
逻辑很清晰:要么是1月的任意一天,要么是2月中不超过9号的日子。
方式二:转换为月日字符串进行范围筛选
把日期转换成MM-DD格式的字符串,利用字符串的字典序来筛选范围:
# 新增临时列存储月日信息 df['month_day'] = df['Date'].dt.strftime('%m-%d') # 筛选'01-01'到'02-09'之间的数据 filtered_df = df[(df['month_day'] >= '01-01') & (df['month_day'] <= '02-09')] # 用完临时列可以删掉 filtered_df = filtered_df.drop('month_day', axis=1)
这种写法不用拆分月和日,代码更简洁,而且因为是两位的月日,字符串比较的结果和日期顺序完全一致。
方式三:用query方法简化代码
Pandas的query方法可以让你用类似SQL的语法筛选数据,可读性很强:
filtered_df = df.query( "(Date.dt.month == 1) or (Date.dt.month == 2 and Date.dt.day <= 9)" )
这种写法最接近自然语言,看起来一目了然。
小提示
- 如果你的
Date列已经是datetime类型,直接跳过第一步就行; - 不用担心闰年的问题,2月9日在平年和闰年都存在,不会有筛选异常;
- 筛选完后可以用
filtered_df.head()或者filtered_df['Date'].unique()检查一下结果是否符合预期。
内容的提问来源于stack exchange,提问作者Pattu
相关产品推荐
相关产品推荐

