从Pandas DataFrame获取特定值并比较日期时出错,求解决方案
问题描述
- CSV文件内容:
domain1.com,1.1.1.1,2023-01-01,description 1 domain2.com,2.2.2.2,2023-02-23,,description 2
- 读取CSV并创建DataFrame的代码:
import pandas as pd from datetime import datetime, timedelta dataset = pd.read_csv('database\\domain\\ip.csv', sep = ',', header = None) dataset.columns = ['domain', 'ip', 'data', 'ASN'] dataset['data'] = pd.to_datetime(dataset['data'], format="%Y-%m-%d")
- 检查特定域名是否存在的代码:
if((dataset["domain"] == 'domain2').any()): # 执行操作
- 尝试比较日期的代码及报错:
a = dataset[dataset["domain"] == 'wp.pl.com']['data'] if (datetime.now() - a) > timedelta(days = 30): # 执行操作
报错信息:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().- 修改为
a.any()/a.all()后:TypeError: unsupported operand type(s) for -: 'datetime.datetime' and 'bool'
解决思路与代码修正
核心问题
dataset[dataset["domain"] == 'wp.pl.com']['data']返回的是Pandas Series对象(即使只有一条匹配结果),不是单个日期值。直接用单个datetime和Series做运算,会因为批量数据的歧义性触发错误。
修正方案
1. 针对单个匹配结果(域名唯一)
用.iloc[0]提取Series中的单个日期值,同时先判断是否存在匹配记录:
match_rows = dataset[dataset["domain"] == 'wp.pl.com'] if not match_rows.empty: target_date = match_rows['data'].iloc[0] if (datetime.now() - target_date) > timedelta(days=30): # 执行你的业务逻辑 print("日期间隔超过30天") else: print("未找到目标域名")
2. 针对多个匹配结果(域名不唯一)
直接对Series进行批量运算,筛选符合条件的记录:
target_dates = dataset[dataset["domain"] == 'wp.pl.com']['data'] # 批量计算并筛选日期差超过30天的记录 valid_dates = target_dates[datetime.now() - target_dates > timedelta(days=30)] if not valid_dates.empty: print(f"找到{len(valid_dates)}条符合条件的记录") # 处理这些记录
3. 域名存在检查的优化
原代码中dataset["domain"] == 'domain2'可能匹配不到(CSV中是domain2.com),建议改为:
if 'domain2.com' in dataset['domain'].values: print("目标域名存在")
内容的提问来源于stack exchange,提问作者Mariusz
相关产品推荐
相关产品推荐

