Pandas Query无法处理日期值,如何合并为单条查询语句?
问题描述
从CSV文件读取数据,其中Time列格式为'22-02-21',执行以下代码处理日期:
df = pd.read_csv('input.csv',parse_dates=['Time']) df['Time'] = pd.to_datetime(df['Time'], format='%Y-%m-%d')
Time列显示为非空的datetime64[ns]类型。分开两次查询可得到有效结果:
df2 = df.query('Column1 =="value" & Column2 =="abc" & `C Type`=="type" ') filtered=df2.query("Time =='2023-01-02'")
但将所有条件合并到单条Query语句时,结果总和为0:
df2 = df.query((f'column1=="value" & Column2 =="abc" & `C Type`=="type" & Time =="2022-01-26"')) print (" Test ********** Sum:",sum(df2['Measure'])) # 输出 Sum:0
问题原因
- 引号转义与字符串构造错误:合并查询时使用了HTML转义符
",同时嵌套f-string的方式导致传递给query的条件字符串格式异常,Time的匹配条件未被正确解析。 - Datetime与字符串的匹配逻辑差异:单独查询时,pandas可能会自动将字符串日期转换为datetime类型匹配,但合并查询时,复杂表达式的解析逻辑可能导致字符串无法正确转换,进而匹配失败。
- 日期转换的潜在格式冲突:原始日期是2位年份格式
'22-02-21',但转换时使用了4位年份的格式%Y-%m-%d,可能导致解析后的日期与预期不符(比如将22识别为2022年,而非1922年),虽然单独查询能命中,但合并时可能因隐藏的格式问题导致匹配失效。
解决方法
方法1:修正Query字符串的引号格式
直接使用单双引号嵌套构造查询条件,避免转义符和错误的f-string嵌套:
# 直接构造查询字符串,内部用双引号,外部用单引号 df2 = df.query('Column1 == "value" & Column2 == "abc" & `C Type` == "type" & Time == "2022-01-26"') print("Test ********** Sum:", df2['Measure'].sum())
或者用f-string时,内部使用单引号:
target_date = "2022-01-26" df2 = df.query(f'Column1 == "value" & Column2 == "abc" & `C Type` == "type" & Time == \'{target_date}\'') print("Test ********** Sum:", df2['Measure'].sum())
方法2:引用外部Datetime对象确保类型匹配
通过@符号在query中引用外部的pd.Timestamp对象,彻底避免类型转换问题:
target_time = pd.Timestamp("2022-01-26") df2 = df.query('Column1 == "value" & Column2 == "abc" & `C Type` == "type" & Time == @target_time') print("Test ********** Sum:", df2['Measure'].sum())
方法3:修正日期转换逻辑
针对原始日期的2位年份格式,使用%y-%m-%d格式解析,确保日期转换完全符合预期:
# 方式1:读取时直接指定日期格式 df = pd.read_csv('input.csv', parse_dates=['Time'], date_format='%y-%m-%d') # 方式2:读取后再转换 df = pd.read_csv('input.csv') df['Time'] = pd.to_datetime(df['Time'], format='%y-%m-%d')
内容的提问来源于stack exchange,提问作者v s
相关产品推荐
相关产品推荐

