You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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):
    # 执行操作

报错信息:

  1. ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
  2. 修改为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:05:35