如何解决Pandas中日期格式不统一时筛选日期范围行返回空DataFrame?
解决Pandas中多格式日期筛选为空的问题
嘿,这个问题我太熟了!你得到空DataFrame的根本原因是——你的ColDate列还只是字符串类型,不同格式的字符串直接用between做比较,完全是按字符顺序来判断的,根本不是按实际日期大小,所以自然筛不到数据。下面给你一套两步走的解决方案:
第一步:统一转换日期列为Datetime类型
Pandas的pd.to_datetime函数超级智能,能自动识别绝大多数常见的日期格式(不管是yyyy-mm-dd、dd-mm-yyyy还是mm/dd/yyyy),我们先把字符串列转成标准的datetime类型:
import pandas as pd # 你的原始数据 data = { 'Col1': ['a', 'b', 'c', 'd', 'e', 'f'], 'ColDate': ['2020-09-11 08:43:00', '2020-09-12 09:43:00', '13-09-2020 09:43:00', '09/16/2020 10:43:00', '09/19/2020 12:43:00', '09/12/2020 15:43:00'] } df = pd.DataFrame(data) # 转换日期列,infer_datetime_format=True让Pandas自动推断格式 df['ColDate'] = pd.to_datetime(df['ColDate'], infer_datetime_format=True)
第二步:按日期范围筛选
现在ColDate已经是datetime类型了,就可以正常用between来筛选了。注意如果要包含9月13日全天的数据,最好把上限设为2020-09-14(因为between是左闭右闭区间,2020-09-13默认指当天0点,会漏掉当天非凌晨的时间):
# 筛选2020年9月11日0点到9月14日0点之间的数据(即包含9.11-9.13全天) filtered_df = df[df['ColDate'].between('2020-09-11', '2020-09-14')] print(filtered_df)
执行后你会得到预期的结果:
Col1 ColDate 0 a 2020-09-11 08:43:00 1 b 2020-09-12 09:43:00 2 c 2020-09-13 09:43:00 5 f 2020-09-12 15:43:00
为什么原来的代码不行?
举个例子,你的原始数据里'13-09-2020'作为字符串,和'11-09-2020'比字符顺序是对的,但和'2020-09-11'比的话,字符串开头是'1' vs '2',Pandas会认为'13-09-2020'比'2020-09-11'小,自然会被排除在外,所以必须先转成datetime类型才能按实际时间逻辑比较。
内容的提问来源于stack exchange,提问作者Echchama Nayak
相关产品推荐
相关产品推荐

