
本文旨在解决在使用 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 方法。
确保 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 方法。
在 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 的 isin 方法结合 datetime 对象进行数据筛选时,遇到的条件判断始终为 False 的问题。通过分析问题原因和提供解决方案,帮助读者理解 Pandas 中日期类型处理的细节,并掌握正确使用 isin 方法进行日期筛选的技巧。希望本文能够帮助读者在实际工作中更好地处理日期时间数据。
以上就是Pandas 中使用 isin 方法进行日期比较时返回 False 的问题解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号