如何从CSV股票数据文件提取指定股票指定月份的最后交易日
问题背景
你有一份存储了30年股票数据的CSV文件,数据样例如下:
需求是提取指定股票、指定月份的最后一个交易日数据,比如股票s_0003在2018年6月的最后一个交易日数据。
代码问题诊断
你的代码核心错误是未将date列转换为日期类型就直接取最大值:CSV读取后的date列默认是字符串格式,字符串按字符逐位比较字典序,6/9/18的第三位字符9比6/30/18的第三位字符3大,因此max()返回了错误的日期。
额外可优化点:反复调用pd.to_datetime做重复转换,执行效率低,也没有必要单独拆分子表。
实现方案
方案1:修复原逻辑
import pandas as pd df = pd.read_csv(stocks) # 先统一转换日期格式,一次转换后续可反复使用 # 如果你的日期格式是日/月/年,需要加参数 dayfirst=True 避免解析错误 df['date'] = pd.to_datetime(df['date']) # 一次性筛选2018年6月的目标股票数据 jun_data = df[(df['date'].dt.year == 2018) & (df['date'].dt.month == 6)] # 取当月最大日期即为最后一个交易日 last_trade_day = jun_data['date'].max() # 提取对应股票数据 s_0003_value = jun_data.loc[jun_data['date'] == last_trade_day, 's_0003'].iloc[0]
方案2:通用批量处理方案(推荐)
如果需要频繁查询不同股票、不同月份的最后交易日数据,可先对数据做预处理,后续查询更高效:
import pandas as pd df = pd.read_csv(stocks) df['date'] = pd.to_datetime(df['date']) # 将日期设为索引并排序,为后续重采样做准备 df = df.set_index('date').sort_index() # 按月重采样,直接保留每个月最后一条交易日的所有股票数据 monthly_last_data = df.resample('M').last() # 查询2018年6月s_0003的最后交易日数据,直接取值即可 s_0003_value = monthly_last_data.loc['2018-06', 's_0003']
内容的提问来源于stack exchange,提问作者Hidden Angle
相关产品推荐
相关产品推荐

