基于日期与时间列过滤Pandas DataFrame的技术求助
解决Pandas DataFrame按日期时间过滤时的逻辑错误问题
你遇到的问题核心在于把日期和时间分开独立比较的逻辑漏洞——原来的条件会错误过滤掉「日期晚于最后一条记录,但时间早于最后记录时间」的条目(比如31-May-2018的凌晨时间)。正确的做法是把日期和时间合并成完整的datetime对象,再做统一比较。
具体解决步骤与代码
- 将数据库最后一条记录的日期和时间合并为完整datetime
- 把DataFrame中的Date和Time列合并成datetime类型列
- 基于完整datetime筛选出更新的条目
import pandas as pd from datetime import datetime # 模拟你的DataFrame数据 data = { 'Time': ['00:07:00', '00:11:00', '20:04:00', '20:06:00'], 'Date': ['31-May-2018', '31-May-2018', '30-May-2018', '30-May-2018'], 'Items': ['gaaa', 'raaa', 'old1', 'new1'] } df = pd.DataFrame(data) # 数据库返回的最后一条记录 last_entry = ['20:05:00','30-May-2018'] # 合并为完整的datetime对象 last_datetime = datetime.strptime(f"{last_entry[1]} {last_entry[0]}", '%d-%b-%Y %H:%M:%S') # 把DataFrame的Date和Time列合并成标准datetime列 df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'], format='%d-%b-%Y %H:%M:%S') # 筛选出晚于最后一条记录的条目,可按需删除临时的Datetime列 new_entry = df[df['Datetime'] > last_datetime].drop('Datetime', axis=1) # 输出符合预期的结果 print(new_entry)
输出结果(匹配你的需求)
Time Date Items 0 00:07:00 31-May-2018 gaaa 1 00:11:00 31-May-2018 raaa 3 20:06:00 30-May-2018 new1
为什么原来的代码会出错?
原来的条件(df['Date'] >= last_entry[1]) & (df['Time'] > last_entry_time)是逻辑与的关系:
- 对于日期大于
30-May-2018的条目(比如31号),还要求时间必须大于20:05:00,但凌晨时间显然不满足,导致这些本该保留的条目被错误过滤。 - 正确逻辑应该是:只要完整的日期时间晚于最后一条记录的datetime就保留——日期更大时不管时间,日期相同时时间必须更晚。
内容的提问来源于stack exchange,提问作者jake wong
相关产品推荐
相关产品推荐

