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

DDD
发布: 2025-10-12 12:53:33
原创
581人浏览过

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 对象。

    AI建筑知识问答
    AI建筑知识问答

    用人工智能ChatGPT帮你解答所有建筑问题

    AI建筑知识问答 22
    查看详情 AI建筑知识问答
    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 访问器可以方便地提取日期时间的各个部分,例如年、月、日、时、分、秒等。
  • 在比较日期时间对象时,可以使用 ==、>、< 等运算符,也可以使用 isin 方法。

总结

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

以上就是Pandas 中使用 isin 方法进行日期比较时返回 False 的问题解析的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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