如何在Python DataFrame中筛选日期列等于昨日的数据
筛选DataFrame中昨日数据的解决方案
问题关键点
你当前代码里的df['Date'] = df['Date'].dt.strftime('%Y-%m-%d')会把datetime类型转为字符串,这直接导致后续无法用datetime相关方法做日期筛选,这是核心问题。另外原始日期带Z标识(UTC时区),处理时必须保证时区一致性,否则会出现日期匹配偏差。
修正后的完整代码
import pandas as pd from datetime import datetime, timedelta import pytz # 1. 正确处理日期列(保留datetime类型,明确UTC时区) # 处理df的Date列,注意格式要匹配带Z的原始日期 df['Date'] = pd.to_datetime(df['Date'], format="%Y-%m-%dT%H:%M:%S.%fZ", errors='coerce') df['Date'] = df['Date'].dt.tz_localize('UTC') # 标记为UTC时区 # 处理merged_left的releaseDate列,确保为datetime类型 merged_left['ResponseData releaseDate'] = pd.to_datetime(merged_left['ResponseData releaseDate'], errors='coerce') # 如果releaseDate原始也是UTC时区,同样标记: # merged_left['ResponseData releaseDate'] = merged_left['ResponseData releaseDate'].dt.tz_localize('UTC') # 2. 计算UTC时区的昨日日期 yesterday_utc = datetime.now(pytz.utc) - timedelta(days=1) yesterday_date = yesterday_utc.date() # 3. 筛选昨日数据 # 筛选df中Date列日期等于昨日的行 df_yesterday = df[df['Date'].dt.date == yesterday_date] # 筛选merged_left中releaseDate等于昨日的行 merged_left_yesterday = merged_left[merged_left['ResponseData releaseDate'].dt.date == yesterday_date]
额外说明
- 若需基于本地时区的昨日(而非UTC),将
datetime.now(pytz.utc)替换为对应时区,例如中国时区:datetime.now(pytz.timezone('Asia/Shanghai')),再提取日期部分。 - 务必保证所有日期列的时区统一,否则会出现“明明有数据却筛选不到”的情况。
- 之前尝试失败的原因:要么日期列被转成字符串无法调用
dt.date方法,要么本地时区和UTC时区的“昨日”范围不一致,导致匹配失败。
内容的提问来源于stack exchange,提问作者JulieKent
相关产品推荐
相关产品推荐

