使用dt.to_period('M')转月份后无法筛选pandas DataFrame行如何解决
问题原因及解决方法
核心原因说明
- 你构造DataFrame时传入的
txn_date是字符串格式,未转换为pandas的datetime类型,直接使用.dt访问器本身就会报错,无法生成正确的txn_month字段。就算你实际环境中做过初步的日期转换,也存在转换不规范、后续比较类型不匹配的问题。 dt.to_period('M')返回的是pandas的Period类型,部分版本下直接和字符串'2021-05'比较会出现匹配失败的情况。- 额外注意:你构造DataFrame时用了集合
{}存储列值,集合是无序且不支持重复值的结构,会导致行数据顺序错乱、数据丢失,需要改用列表[]存储列值。
完整可运行的解决代码
import pandas as pd # 第一步:正确构造DataFrame,用列表存储列值 df = pd.DataFrame({ "txn_id": ['A','B','C'], "txn_date": ['2019-04-01','2020-06-01','2021-05-01'] }) # 第二步:必须先把txn_date转为datetime类型,这是所有日期操作的前提 df['txn_date'] = pd.to_datetime(df['txn_date']) # 第三步:筛选2021-05的行,两种任选其一即可 # 方案1:转成字符串后比较,兼容性最高 df['txn_month'] = df['txn_date'].dt.strftime('%Y-%m') result = df[df['txn_month'] == '2021-05'] # 方案2:用Period类型比较,显式转成Period对象避免类型不匹配 # df['txn_month'] = df['txn_date'].dt.to_period('M') # result = df[df['txn_month'] == pd.Period('2021-05', freq='M')] print(result)
内容的提问来源于stack exchange,提问作者Cathie
相关产品推荐
相关产品推荐

