无法匹配用户输入日期与DataFrame日期,代码未返回目标行求排查
问题:筛选DataFrame中日期匹配的行失败原因及解决方法
我尝试筛选出DataFrame中日期与用户输入日期匹配的行,但以下代码未返回目标行,请问问题出在哪里?
import pandas as pd from datetime import datetime df = pd.DataFrame({"Day": pd.to_datetime("2022-10-26"), "y": 5}, index=[0]) print(df) get_year = input("Enter Year: ") get_month = input("Enter Month: ") get_day= input("Enter Day of Month: ") inputdate = get_year+"-"+get_month+"-"+get_day rundate1 = datetime.strptime(inputdate,'%Y-%m-%d') rundate = (rundate1.date()) print(rundate) x = df[df['Day']] == rundate print(x)
错误原因分析
- 筛选语法错误:你写的
df[df['Day']] == rundate是完全错误的布尔筛选格式。正确的写法应该是将判断条件df['Day'] == rundate整体放入方括号中,作为DataFrame的索引,也就是df[df['Day'] == rundate],这样才能用布尔值筛选出符合条件的行。 - 日期类型不匹配:DataFrame中的
Day列是pandas的datetime64[ns]类型,而你生成的rundate是Python标准库的date类型,两种不同的日期类型直接比较会导致匹配失败,无法筛选出目标行。
修正后的代码
import pandas as pd from datetime import datetime df = pd.DataFrame({"Day": pd.to_datetime("2022-10-26"), "y": 5}, index=[0]) print(df) get_year = input("Enter Year: ") get_month = input("Enter Month: ") get_day= input("Enter Day of Month: ") inputdate = f"{get_year}-{get_month}-{get_day}" # 方法1:将输入日期转为pandas datetime类型,与Day列类型保持一致 rundate = pd.to_datetime(inputdate) # 正确的布尔筛选写法 matched_rows = df[df['Day'] == rundate] print(matched_rows) # 方法2:也可以将Day列转为Python date类型再比较 # matched_rows = df[df['Day'].dt.date == datetime.strptime(inputdate,'%Y-%m-%d').date()] # print(matched_rows)
内容的提问来源于stack exchange,提问作者Andrew Martin
相关产品推荐
相关产品推荐

