![](/img/trans.png)
[英]Pandas reading csv from url, read first row and set header as second
[英]pandas read .csv from url, starting row has fewer header
我想從這個網站下載一個.csv文件(直接下載csv, 在這里)。 我面臨的問題是,我要開始導入的行的列比后面部分的行少,我只是不知道如何讀入 pandas。
確實,這個 csv 文件相當不美觀。
這是我想在 pandas 中導入 csv 的方式:
忽略有“交易日期”的第一行
部分之間的單獨數據框(使用for循環,只要有空白行就分開)
將 JPX 代碼(例如 16509005)和儀器(例如 FUT_TOPIX_2009)存儲在附加列中。
設置標題 ['institutions_sell_code'、'institutions_sell'、'institutions_sell_eng'、'amount_sell'、'institutions_buy_code'、'institutions_buy'、'institutions_buy_eng'、'amount_buy'、'JPX_code'、'instrument']
所以預期的結果將是:
這是我的嘗試。 我首先嘗試將整個數據讀入 pandas:
import io
import pandas as pd
import requests
url = 'https://www.jpx.co.jp/markets/derivatives/participant-volume/nlsgeu000004vd5b-att/20200730_volume_by_participant_whole_day_J-NET.csv'
s=requests.get(url).content
colnames = ['institutions_sell_code', 'institutions_sell', 'institutions_sell_eng', 'amount_sell', 'institutions_buy_code', 'institutions_buy', 'institutions_buy_eng', 'amount_buy']
df=pd.read_csv(io.StringIO(s.decode('utf-8')), header=1, names = colnames)
ParserError: Error tokenizing data. C error: Expected 2 fields in line 6, saw 8
我認為這是因為 header=1 只有兩列,而其他行有八列。 事實上,當我設置header=2
以排除 JPX 代碼和儀器時,它可以工作。 那么如何在 JPX 代碼和儀器中包含該行?
Pandas 並不像您那樣真正支持一個 CSV 文件中的多個文檔。 我為解決這個問題所做的工作很好,需要兩個步驟:
read_csv(use_cols=[0])
一次以讀取最左邊的列。 使用它來確定每個表的開始和結束位置。open()
打開文件一次,對於步驟 1 中確定的每個表,調用read_csv(skiprows=SKIP, nrows=ROWS)
並使用適當的值一次讀取一個表。 這是關鍵:只讓 Pandas 讀取正確的矩形行,它不會對 CSV 文件的不衛生性質感到憤怒。 只打開一次文件是一種優化,以避免每次執行步驟 2 時一遍又一遍地掃描它。實際上,您也可以在步驟 1 中使用相同的打開文件 object,如果您seek(0)
回到開頭之前開始第 2 步。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.