如何用Pandas导入含间隔日期索引的股票CSV并生成单索引DataFrame?
解决方法:将多日期列的股票CSV转换为单一日期索引DataFrame
这种每只股票自带独立日期列的CSV结构确实有点反常规,不过用Pandas分几步就能把它转换成你想要的单一日期索引格式,我来给你详细说下怎么做:
步骤1:读取原始数据
首先,我们先完整读取CSV文件,不要设置index_col,避免丢失其他股票的日期列:
import pandas as pd # 替换成你的文件路径 df_raw = pd.read_csv('your_stock_data.csv', sep=';', header=0)
此时df_raw会保留所有原始列,比如['date', 'stock_A', 'date', 'stock_B', 'date', 'stock_C']这类重复列名,Pandas会自动处理重复列的识别。
步骤2:拆分并整理每只股票的数据
因为数据是按「日期列+股票值列」成对出现的,我们可以循环遍历这些列对,把每只股票的数据单独整理成带datetime索引的Series:
stock_dfs = [] # 按步长2遍历列索引,每次处理一对(日期列+股票值列) for i in range(0, len(df_raw.columns), 2): date_col = df_raw.columns[i] stock_col = df_raw.columns[i+1] # 提取当前股票的日期和值,重命名日期列并过滤空行 single_stock = df_raw[[date_col, stock_col]].rename(columns={date_col: 'datetime'}) single_stock = single_stock.dropna(subset=['datetime']) # 转换日期格式(匹配你的CSV日期格式:dd.mm.yyyy HH:mm) single_stock['datetime'] = pd.to_datetime(single_stock['datetime'], format='%d.%m.%Y %H:%M') # 转换股票值为数值类型,空值填充为0 single_stock[stock_col] = pd.to_numeric(single_stock[stock_col], errors='coerce').fillna(0) # 设置datetime为索引,只保留股票值列 single_stock = single_stock.set_index('datetime')[stock_col] stock_dfs.append(single_stock)
步骤3:合并为单一日期索引的DataFrame
最后,我们用concat将所有股票的Series合并,使用outer join保留所有时间戳,缺失的股票值用0填充:
# 合并所有股票数据,填充缺失值为0 final_df = pd.concat(stock_dfs, axis=1).fillna(0) # 可选:将索引转为普通列,匹配你想要的格式 final_df = final_df.reset_index().rename(columns={'index': 'date'})
运行完这段代码后,你就能得到和期望一致的DataFrame:所有时间戳作为单一索引(或列),每只股票对应一列,没有数据的时间点自动填充0。
额外说明
- 如果你的CSV日期格式和示例不同,可以调整
pd.to_datetime里的format参数; - 如果股票列的命名不是
stock_X这种规律的,代码依然适用,因为我们是按列的位置成对处理的; - 这段代码会自动过滤掉日期为空的无效行,避免干扰最终结果。
内容的提问来源于stack exchange,提问作者Krasnars
相关产品推荐
相关产品推荐

