我使用某些附加条件向网络服务器运行查询。 我指定了一个日期范围,该范围会更改网址中的日期。 然后,我将数据线拉到指定的交易品种,并得到指定库存和时间范围的空头数量清单。 但是,我希望能够将输出作为数据框获取。 现在,数据框仍然是上一次运行的url中存储的数据框,而不是输出中的数据框。
我尝试使用list_.append,但我没有上班。
import pandas as pd
from datetime import datetime
import urllib
symbols = ['AABA']
start_date = datetime(2019, 5, 10 )
end_date = datetime(2019, 5, 15 )
datelist = pd.date_range(start_date, periods=(end_date-start_date).days+1).tolist()
for date in datelist:
url = f"http://regsho.finra.org/FNYXshvol{date.strftime('%Y%m%d')}.txt"
try:
df = pd.read_csv(url,delimiter='|')
if any(df['Symbol'].isin(symbles)):
stocks = df[df['Symbol'].isin(symbols)].to_string(index=False, header=False)
print(stocks)
else:
print(f'No stock found for {date.date()}' )
except urllib.error.HTTPError:
continue
现在的结果是:
20190510 AABA 2300.0 0.0 14617.0 N
20190513 AABA 2816.0 0.0 39128.0 N
20190514 AABA 1761.0 0.0 26191.0 N
20190515 AABA 24092.0 0.0 62745.0 N
我希望结果在数据框中,以便我可以将结果直接导出到csv
答案 0 :(得分:0)
当要将输出作为数据帧时,为什么将数据帧转换为字符串? (例如,df[df['Symbol'].isin(symbols)].to_csv('ABBA.csv', index=False, header=False)
)无论如何,要将字符串转换回数据帧,您可以使用pandas.read_fwf
:
from io import StringIO
df=pd.read_fwf(StringIO(stocks), header=None)
输出:
0 1 2 3 4 5
0 20190510 AABA 2300.0 0.0 14617.0 N
1 20190513 AABA 2816.0 0.0 39128.0 N
2 20190514 AABA 1761.0 0.0 26191.0 N
3 20190515 AABA 24092.0 0.0 62745.0 N
答案 1 :(得分:0)
stocks
是将其转换为字符串之前的数据帧。只需将其保存为数据框,将其存储在列表中,然后合并该列表即可获得完整的数据框:
dflist = []
for date in datelist:
url = f"http://regsho.finra.org/FNYXshvol{date.strftime('%Y%m%d')}.txt"
try:
df = pd.read_csv(url,delimiter='|')
if any(df['Symbol'].isin(symbles)):
stocks = df[df['Symbol'].isin(symbols)]
print(stocks.to_string(index=False, header=False))
dflist.append(stocks)
else:
print(f'No stock found for {date.date()}' )
except urllib.error.HTTPError:
continue
df = pd.concat(dflist)