Python中Timestamp、str与datetime64[ns]年月日期的最佳比较方案
最佳日期类型选择及解决方案
针对你的场景,推荐两种最靠谱的类型转换方案,按需选择:
1. 直接用字符串类型比较(最简单高效)
你的所有日期都是"YYYY-MM"的标准格式,只要确保df['Year_Month']的object类型元素都是无格式错误的字符串(比如没有多余空格、不是"2020/01"这类分隔符不一致的情况),直接用字符串比较是最省事的。
格式验证(可选但建议做)
先确认df['Year_Month']的格式统一:
# 检查是否所有元素都是标准的YYYY-MM格式 invalid_rows = df[~df['Year_Month'].str.match(r'^\d{4}-\d{2}$')] if not invalid_rows.empty: print("存在格式错误的日期行:", invalid_rows)
如果没有格式错误,直接用你原来的查询语句即可,不需要额外转换:
df[(df['Year_Month'] == current_month_year) | (df['Year_Month'] == last_month_year)]
2. 转换为pandas Period类型(更适合后续日期操作)
如果之后还要做月份加减、排序、按月份聚合等操作,转成**月度周期(Period[M])**是更严谨的选择,它直接对应"年月"的概念,避免Timestamp带日的冗余信息。
转换步骤:
- 转换DataFrame列:
df['Year_Month'] = df['Year_Month'].astype('period[M]')
- 转换两个字符串变量:
import pandas as pd last_month_year = pd.to_datetime(last_month_year).to_period('M') current_month_year = pd.to_datetime(current_month_year).to_period('M')
- 执行查询:
df[(df['Year_Month'] == current_month_year) | (df['Year_Month'] == last_month_year)]
不推荐Timestamp的原因
Timestamp是带具体日期的类型(转"2020-01"会默认变成2020-01-01 00:00:00),虽然强行比较也可能得到结果,但它额外引入了"日"的信息,不符合你只需要比较"年月"的需求,反而可能因为隐式转换带来不必要的问题。
内容的提问来源于stack exchange,提问作者nilsinelabore
相关产品推荐
相关产品推荐

