0

0

Pandas 中使用 isin 方法进行日期比较时返回 False 的问题解析

DDD

DDD

发布时间:2025-10-12 12:53:33

|

602人浏览过

|

来源于php中文网

原创

pandas 中使用 isin 方法进行日期比较时返回 false 的问题解析

本文旨在解决在使用 Pandas 的 `isin` 方法结合 `datetime` 对象进行数据筛选时,遇到的条件判断始终为 False 的问题。通过分析问题原因和提供解决方案,帮助读者理解 Pandas 中日期类型处理的细节,并掌握正确使用 `isin` 方法进行日期筛选的技巧。

在使用 Pandas 处理包含日期时间类型的数据时,经常需要根据日期进行数据筛选。isin 方法是一个方便的选择,但如果使用不当,可能会遇到意想不到的问题,例如条件判断始终为 False。本文将深入探讨这个问题,并提供解决方案。

问题分析

问题的核心在于日期类型的处理和比较。从问题描述中可以看出,df["Record Date"].dt.date 返回的是一个 "bound method Timestamp.date of Timestamp" 对象,而不是 datetime.date 对象。这意味着 dt.date 返回的是一个方法,需要被调用才能返回具体的日期对象。

另外,plate.date 中的日期类型可能与 df["Record Date"].dt.date 的类型不一致,导致 isin 方法无法正确比较。

解决方案

要解决这个问题,需要确保比较的双方都是 datetime.date 对象,并且正确调用 dt.date 方法。

  1. 确保 plate.date 中的元素是 datetime.date 对象。

    在 Plate 类的初始化方法中,将日期字符串或 datetime 对象转换为 datetime.date 对象。

    红墨
    红墨

    一站式小红书图文生成器

    下载
    from datetime import datetime
    from dateutil.parser import parse
    
    class Plate:
        def __init__(self, ..., date=None):
            ...
    
            if date is not None:
                if isinstance(date, str):
                    self.date = [parse(date).date()] # 将 parse(date).date 返回值放到列表中
                elif isinstance(date, list) or isinstance(date, tuple):
                    if all((isinstance(item, str) or isinstance(item, datetime)) for item in date):
                        self.date = [parse(item).date() for item in date] # 调用 .date() 方法
                    else:
                        raise TypeError("The data type of the elements in the date list/tuple must be datetime or strings.")
                elif isinstance(date, datetime):
                    self.date = [date.date()] # 将 date.date 返回值放到列表中
                else:
                    raise TypeError("The data type of parameter date must be datetime.date, string (containing date) or list/tuple (of dates/strings).")

    注意: 这里将单个日期对象也放入列表中,是为了保证 plate.date 始终是一个日期列表,方便后续使用 isin 方法。

  2. 在 isin 方法中使用 dt.date 的返回值。

    在进行条件判断时,确保调用 dt.date 方法,获取具体的 datetime.date 对象。

    if hasattr(plate, "date"):
        condition = df["Record Date"].dt.date.isin(plate.date)
    else:
        condition = df["Well Name"] != None # True for available data
    
    df.loc[condition, ["sample_type", "index", "initial_measurement"]] = list((df.loc[condition, "Well Name"].astype(str).apply(get_sample_info)))
    
    # Change the data types of the new columns
    df = df.astype({"sample_type": str, "index": pd.Int64Dtype(), "initial_measurement": bool})

完整示例

以下是一个完整的示例,展示了如何正确使用 isin 方法进行日期筛选。

import pandas as pd
from datetime import datetime
from dateutil.parser import parse
import numpy as np

class Plate:
    def __init__(self, well_ranges, date=None):
        self.well_ranges = well_ranges
        self.A1 = ['A1', 'A2']
        self.B1_second = ['B1', 'B2']

        if date is not None:
            if isinstance(date, str):
                self.date = [parse(date).date()] # 将 parse(date).date 返回值放到列表中
            elif isinstance(date, list) or isinstance(date, tuple):
                if all((isinstance(item, str) or isinstance(item, datetime)) for item in date):
                    self.date = [parse(item).date() for item in date] # 调用 .date() 方法
                else:
                    raise TypeError("The data type of the elements in the date list/tuple must be datetime or strings.")
            elif isinstance(date, datetime):
                self.date = [date.date()] # 将 date.date 返回值放到列表中
            else:
                raise TypeError("The data type of parameter date must be datetime.date, string (containing date) or list/tuple (of dates/strings).")

    def __dict__(self):
        return {'A1': self.A1, 'B1_second': self.B1_second}

def get_sample_info(well, plate):
    for sample_type, well_list in plate.__dict__().items():
        if well in well_list and sample_type.replace("_second", "") in plate.well_ranges:
            initial_measurement = True if "_second" not in sample_type else False
            sample_type = sample_type.replace("_second", "")
            index = well_list.index(well) + 1
            return sample_type, int(index), initial_measurement
    return None, np.nan, None

# 创建示例 DataFrame
data = {'Record Date': [datetime(2023, 12, 1, 17, 16, 0), datetime(2023, 12, 6, 10, 0, 0), datetime(2023, 12, 1, 12, 0, 0)],
        'Well Name': ['A1', 'B1', 'C1']}
df = pd.DataFrame(data)

# 创建 Plate 对象
plate = Plate(well_ranges=['A1', 'B1'], date=[datetime(2023, 12, 1), datetime(2023, 12, 6)])

# 使用 isin 方法进行日期筛选
if hasattr(plate, "date"):
    condition = df["Record Date"].dt.date.isin(plate.date)
else:
    condition = df["Well Name"] != None # True for available data

df.loc[condition, ["sample_type", "index", "initial_measurement"]] = df.loc[condition, "Well Name"].astype(str).apply(lambda well: get_sample_info(well, plate)).tolist()

# Change the data types of the new columns
df["sample_type"] = df["sample_type"].astype(str)
df["index"] = pd.to_numeric(df["index"], errors='coerce').astype(pd.Int64Dtype())
df["initial_measurement"] = df["initial_measurement"].astype(bool)

print(df)

注意事项

  • 确保 Pandas 版本是最新的,以便使用最新的功能和修复的 bug。
  • 在处理日期时间数据时,始终注意数据类型,并进行必要的转换。
  • 使用 dt 访问器可以方便地提取日期时间的各个部分,例如年、月、日、时、分、秒等。
  • 在比较日期时间对象时,可以使用 ==、>、

总结

本文详细介绍了在使用 Pandas 的 isin 方法结合 datetime 对象进行数据筛选时,遇到的条件判断始终为 False 的问题。通过分析问题原因和提供解决方案,帮助读者理解 Pandas 中日期类型处理的细节,并掌握正确使用 isin 方法进行日期筛选的技巧。希望本文能够帮助读者在实际工作中更好地处理日期时间数据。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

49

2025.12.04

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

216

2025.10.31

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1435

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

223

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

84

2025.10.17

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

248

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

205

2023.09.04

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 39.6万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号