如何为Pandas DataFrame添加财报发布日期标识列?
解决Pandas财报日期标记问题
嘿,我知道你卡在财报日期匹配的问题上了,这大概率是因为日期格式不统一导致的关联失败,我来给你一步步解决!
问题核心
你的主DataFrame日期是YYYY-MM-DD格式,而财报DataFrame的日期是MM/DD/YYYY格式,而且两者可能都是字符串类型,Pandas无法直接匹配。我们需要先统一日期的格式和类型,再进行关联。
完整解决方案
1. 先定义你的数据(方便复现)
import pandas as pd # 你的主DataFrame(含两年日期数据) main_df = pd.DataFrame({ "Date": ["2018-02-15", "2018-04-02", "2018-04-03", "2018-04-04"], "Stock": [100, 122, 119, 120] }) # 你的财报日期DataFrame earnings_df = pd.DataFrame( columns=["Earnings_Date", "Earnings Reported"], data=[['05/01/2018','Yes'],['02/15/2018','Yes'],['10/31/2017','Yes'],['08/01/2017','Yes']] )
2. 统一日期格式为datetime类型
这是关键步骤,确保两个DataFrame的日期列都是datetime类型,格式一致:
# 转换主DataFrame的Date列为datetime main_df["Date"] = pd.to_datetime(main_df["Date"]) # 转换财报DataFrame的Earnings_Date列为datetime(指定格式避免歧义) earnings_df["Earnings_Date"] = pd.to_datetime(earnings_df["Earnings_Date"], format="%m/%d/%Y")
3. 关联数据并标记财报日期
这里提供两种简单的方法,任选其一即可:
方法一:使用merge左连接(适合需要保留更多财报信息的场景)
# 左连接主数据和财报数据,匹配日期 result_df = pd.merge( main_df, earnings_df, left_on="Date", right_on="Earnings_Date", how="left" ) # 将未匹配到的财报标记设为"No",并删除多余的日期列 result_df["Earnings Reported"] = result_df["Earnings Reported"].fillna("No") result_df = result_df.drop(columns=["Earnings_Date"])
方法二:使用map映射(代码更简洁,适合仅需标记的场景)
# 先把财报日期转成「日期:标记」的字典 earnings_map = earnings_df.set_index("Earnings_Date")["Earnings Reported"].to_dict() # 映射到主DataFrame,未匹配的填充为"No" main_df["Earnings Reported"] = main_df["Date"].map(earnings_map).fillna("No")
4. 最终结果
执行完上面的代码后,你会得到期望的DataFrame:
Date Stock Earnings Reported 0 2018-02-15 100 Yes 1 2018-04-02 122 No 2 2018-04-03 119 No 3 2018-04-04 120 No
内容的提问来源于stack exchange,提问作者OptimusPrime
相关产品推荐
相关产品推荐

