当标题位于不同行时如何最好地使用 read_csv 参数,然后创建第一列日期时间索引

问题描述 投票:0回答:1

由于下载的 csv 前几行中的数据,我在读取和更新 yfinance 的 csv 时遇到问题:

  • 第一行包含我想要的列标题(还有标题 - '价格' - 我不想要)

  • 第二行是垃圾

  • 第三行有我想要的索引标题

下载的 csv(格式化)如下所示:

价格 调整关闭 关闭 打开 音量
股票代码 ^BVSP ^BVSP ^BVSP ^BVSP ^BVSP ^BVSP
日期
2014-01-02 50341.0 50341.0 51656.0 50246.0 51522.0 3476300
2014-01-03 50981.0 50981.0 50981.0 50269.0 50348.0 7360400
2014-01-06 50974.0 50974.0 51002.0 50451.0 50980.0 3727800
2014-01-07 50430.0 50430.0 51478.0 50429.0 50982.0 3339500

原始 .csv 文件如下所示:

Price,Adj Close,Close,High,Low,Open,Volume
Ticker,^BVSP,^BVSP,^BVSP,^BVSP,^BVSP,^BVSP
Date,,,,,,,
2014-01-02,50341.0,50341.0,51656.0,50246.0,51522.0,3476300
2014-01-03,50981.0,50981.0,50981.0,50269.0,50348.0,7360400
2014-01-06,50974.0,50974.0,51002.0,50451.0,50980.0,3727800
2014-01-07,50430.0,50430.0,51478.0,50429.0,50982.0,3339500

一旦阅读,我希望 df 看起来像这样,其中“日期”是日期时间索引:

日期 调整关闭 关闭 打开 音量
2014-01-02 50341.0 50341.0 51656.0 50246.0 51522.0 3476300
2014-01-03 50981.0 50981.0 50981.0 50269.0 50348.0 7360400
2014-01-06 50974.0 50974.0 51002.0 50451.0 50980.0 3727800
2014-01-07 50430.0 50430.0 51478.0 50429.0 50982.0 3339500

我正在使用这段代码,它可以工作,但看起来很笨拙。

idx_df = pd.read_csv(
            f'{data_folder}/INDEX_{idx_code}.csv',
            header=None,
            skiprows=3,  #  data starts on row 4
            names=['Date', 'Adj Close', 'Close', 'High', 'Low', 'Open', 'Volume'],
            index_col='Date'
        )
        idx_df.index = pd.to_datetime(idx_df.index, errors='coerce')  

我的问题:

  1. 有没有更简单/更优雅的 方式,也许使用一行代码,并使用“header”参数,即使“日期”位于位置 (2, 0) 而其他位置位于 (0, 1:6)?
  2. 有没有办法在“read_csv”指令中将索引设置为日期时间,避免“idx_df.index =”行?

谢谢

python pandas datetime header read-csv
1个回答
0
投票

一个可能的解决方案,其步骤是:

  • read_csv
    将名为
    file.csv
    的 CSV 文件加载到数据框中,使用
    skiprows
    参数跳过索引 2 和 3 处的行。

  • rename
    将列名称
    Price
    更改为
    Date

df = pd.read_csv(file.csv, skiprows=[2, 3])

df.rename({'Price': 'Date'}, axis=1)

输出:

         Date  Adj Close    Close     High      Low     Open   Volume
0  2014-01-02    50341.0  50341.0  51656.0  50246.0  51522.0  3476300
1  2014-01-03    50981.0  50981.0  50981.0  50269.0  50348.0  7360400
2  2014-01-06    50974.0  50974.0  51002.0  50451.0  50980.0  3727800
3  2014-01-07    50430.0  50430.0  51478.0  50429.0  50982.0  3339500
© www.soinside.com 2019 - 2024. All rights reserved.