如何将多CSV文件合并为含统一时间列的单DataFrame?
合并多CSV文件并构建统一时间轴的DataFrame方案
我完全get你的需求:要把一批CSV数据合并成一个统一的DataFrame,核心是要有覆盖所有文件时间范围的time列,同时每个文件的PriceUSD数据要对应保留(用文件名当列名)。结合你给出的现有代码逻辑,我整理了一套完整可行的实现方案:
核心思路拆解
- 先收集所有CSV里的time值,构建一个去重、排序后的基准时间序列——这就是最终统一的time列
- 对每个有PriceUSD列的CSV,只保留time和PriceUSD列,把PriceUSD重命名为对应文件名
- 把每个处理后的小DataFrame和基准时间序列做左连接,确保每个时间点都被保留,缺失数据自动补NaN
- 最后把所有对齐后的DataFrame合并成最终的大DataFrame
具体实现代码
import pandas as pd import os # 假设你的nombres是存储CSV文件名的列表,比如["btc.csv", "eth.csv", "sol.csv"] nombres = ["your_file1.csv", "your_file2.csv", "your_file3.csv"] # 第一步:收集所有时间点,构建基准时间轴 all_time_points = [] processed_price_dfs = [] for filename in nombres: # 先读整个文件检查是否有PriceUSD列 temp_full_df = pd.read_csv(filename) if "PriceUSD" in temp_full_df.columns: # 只提取需要的两列,避免占用过多内存 temp_price_df = temp_full_df[["time", "PriceUSD"]].copy() # 把PriceUSD列重命名为文件名(去掉.csv后缀更清爽) clean_filename = os.path.splitext(filename)[0] temp_price_df.rename(columns={"PriceUSD": clean_filename}, inplace=True) # 收集这个文件的所有时间点 all_time_points.extend(temp_price_df["time"].tolist()) # 把处理好的df加入列表 processed_price_dfs.append(temp_price_df) # 构建基准时间DataFrame:去重、排序,确保时间轴完整 base_time_df = pd.DataFrame({"time": sorted(list(set(all_time_points)))}) # 第二步:把每个价格df和基准时间轴对齐 aligned_dfs = [] for df in processed_price_dfs: # 左连接保证所有基准时间都保留,缺失的价格用NaN填充 aligned_df = pd.merge(base_time_df, df, on="time", how="left") aligned_dfs.append(aligned_df) # 第三步:合并所有对齐后的df,得到最终结果 final_merged_df = base_time_df.copy() for df in aligned_dfs: final_merged_df = pd.merge(final_merged_df, df, on="time", how="left") # 如果你需要保留完整的原始数据(对应你原来的dflistcompleto) # full_data_list = [pd.read_csv(f) for f in nombres if "PriceUSD" in pd.read_csv(f).columns] # 查看结果 print(final_merged_df.head())
关键细节提示
- 时间格式统一:如果不同CSV的time列格式不统一(比如有的是字符串、有的是时间戳),可以在读取时统一转成datetime类型:
temp_price_df["time"] = pd.to_datetime(temp_price_df["time"]) - 性能优化:如果CSV文件特别大,建议只读取time列来收集时间点,避免重复加载整个文件:
# 只读取time列,节省内存 temp_time = pd.read_csv(filename, usecols=["time"])["time"].tolist() all_time_points.extend(temp_time) - 缺失值处理:如果需要填充NaN(比如用前一天的值、均值),可以在合并后处理:
# 前向填充(用最近的非缺失值填充) final_merged_df.fillna(method="ffill", inplace=True) # 或者按列填充均值 final_merged_df = final_merged_df.apply(lambda col: col.fillna(col.mean()), axis=0)
内容的提问来源于stack exchange,提问作者Luis Bleriot
相关产品推荐
相关产品推荐

