使用Pandas筛选每月1日和15日数据时返回空DataFrame的问题
Pandas筛选每月1日和15日数据返回空DataFrame的原因及解决方法
问题背景
需要从大型CSV数据集里筛选出每月1日和15日的所有记录并保存到新CSV文件。单独筛选1日数据的代码可以正常得到结果,但同时筛选1日和15日的代码返回空DataFrame。
单独筛选1日数据的代码及结果
print(df[(df['data___date_time'].dt.day == 1)])
运行结果:
data___date_time NO2 SO2 PM10 26 2020-07-01 00:00:00 1.591616 0.287604 NaN 27 2020-07-01 01:00:00 1.486401 NaN NaN 28 2020-07-01 02:00:00 1.362056 NaN NaN 29 2020-07-01 03:00:00 1.295101 0.194399 NaN 30 2020-07-01 04:00:00 1.260667 0.362168 NaN ... ... ... ... 17054 2022-07-01 19:00:00 2.894369 2.077140 19.34 17055 2022-07-01 20:00:00 3.644265 1.656386 23.09 17056 2022-07-01 21:00:00 2.907760 1.291555 23.67 17057 2022-07-01 22:00:00 2.974715 1.318185 27.68 17058 2022-07-01 23:00:00 2.858022 1.169057 25.18
错误的同时筛选代码及结果
print(df[(df['data___date_time'].dt.day == 1) & (df['data___date_time'].dt.day == 15)])
运行结果:
Empty DataFrame Columns: [data___date_time, NO2, SO2, PM10] Index: []
问题原因
你用了&(逻辑与)运算符,这要求某一行的data___date_time字段的日数同时等于1和15,这在逻辑上是不可能的,所以返回空DataFrame。
解决方法
要筛选出日数是1或者15的记录,有两种常用方法:
方法1:使用逻辑或运算符|
# 筛选1日或15日的记录 filtered_df = df[(df['data___date_time'].dt.day == 1) | (df['data___date_time'].dt.day == 15)] # 保存到新CSV文件 filtered_df.to_csv('filtered_data.csv', index=False)
方法2:使用isin()方法(更简洁,适合多个值的情况)
# 定义需要筛选的日数列表 target_days = [1, 15] # 筛选日数在列表中的记录 filtered_df = df[df['data___date_time'].dt.day.isin(target_days)] # 保存到新CSV文件 filtered_df.to_csv('filtered_data.csv', index=False)
内容的提问来源于stack exchange,提问作者kamyar1986
相关产品推荐
相关产品推荐

