如何获取每月最后交易日及对应股价?Pandas代码求助
解决每月最后一个交易日股价的获取问题
别担心,第一次用Pandas处理这类时间序列数据很容易踩小细节坑,我来帮你一步步搞定。
你目前的代码只完成了读取数据和设置索引的基础操作,缺少几个关键步骤,导致分组取最大日期的逻辑没生效。我们一步步来修正:
1. 先把日期列转成datetime类型
CSV文件里的date列默认读进来是字符串格式,Pandas没法正确识别日期的先后顺序,这是你之前分组失败的核心原因。所以第一步必须把它转成datetime类型:
import pandas as pd # 读取数据时直接解析日期列,省得后续再转换 data = pd.read_csv('csv_file', parse_dates=['date']) # 如果已经读入数据才想起转换,也可以用这行: # data['date'] = pd.to_datetime(data['date'])
2. 设置日期为索引(可选,但更方便操作)
这一步你已经做了,确保日期是datetime类型后再设置索引:
data.set_index('date', inplace=True)
3. 提取每月最后一个交易日的数据
这里有两种简单可靠的方法,任选其一就行:
方法一:用resample快速实现(推荐)
Pandas的resample是专门处理时间序列频率转换的工具,'M'代表月末周期,last()会自动取每个月里最后一条存在的交易日数据:
# 直接按月份重采样,取每个月的最后一行数据 monthly_last_trade = data.resample('M').last()
方法二:手动分组取最大日期
如果你想手动实现“按月分组→找最大日期→提取对应行”的逻辑,可以这样写:
# 给数据添加一个「年月」列,用于分组依据 data['year_month'] = data.index.to_period('M') # 按年月分组,筛选出每个组里日期最大的那一行 monthly_last_trade = data.groupby('year_month').apply(lambda x: x[x.index == x.index.max()]) # 最后可以删掉临时的年月列 monthly_last_trade.drop('year_month', axis=1, inplace=True)
验证结果
最后打印结果确认是不是你想要的每月最后交易日数据:
print(monthly_last_trade)
总结一下,你之前失败的主要原因是日期列没转成datetime类型,Pandas把字符串日期当成普通文本比较,自然没法正确找到每个月的最后一天。转成datetime后,不管用哪种方法都能轻松搞定~
内容的提问来源于stack exchange,提问作者olleh
相关产品推荐
相关产品推荐

