我有这种格式的分钟分辨率库存数据
19980102 930 3.29473 3.30923 3.29473 3.29473 76119.2 4 0 0
列在哪里
“日期”,“时间”,“开放”,“高”,“低”,“收盘”,“交易量”,“分割因子”,“收益”,“股息”
(行以0x0A(换行符)而不是CR LF终止。看起来pandas.read_csv可以很好地读取此数据。)
数据来自一家名为www.QuantQuote.com的公司
我对Pandas和python还是很陌生,但是我读过Wes McKinney撰写的“ Python for Data Analysis”。这是我的第一个python项目,但是我已经写了C,C ++,C#,汇编器等代码很多年了。
我的目标是为每个股票创建一个DataFrame,并将日期和时间组合到一个TimeSeries“ DateTime”索引中。然后,我打算将其重新采样为“每日和每月数据框架”。
我尝试了多种方法来使pandas.read_csv一步读取,但我找不到找到使其读取“时间”列的方法。它在一个奇怪的
930、931、932 ... 17:28、17:29、17:30
格式
有一个更好的方法吗 ?我希望通过一次对_read_csv的调用来读取数据
这是我到目前为止所拥有的。
from pandas import Series, DataFrame
import pandas as pd
import os
mypath = "c:\PythonStuff\QuantQuoteData\table_aapl.txt"
columnHeadings = ['Date', 'Time', 'Open', 'High', 'Low', 'Close', 'Volume', 'Split Factor', 'Earnings', 'Dividends']
minData = pd.read_csv(mypath, names=columnHeadings, dtype= {"Date":str, "Time":str}, parse_dates = False, sep=' ')
minData["Time"] = minData["Time"].map(lambda x : x[:-2] + ":" + x[-2:] + ":00+00:00")
minData["DateTimeStr"] = minData["Date"] + " " + minData["Time"]
minData["DateTime"] = pd.to_datetime(minData["DateTimeStr"])
minData.index = minData["DateTime"]
这是“ table_aapl.txt”文件的前几行
19980102 930 3.29473 3.30923 3.29473 3.29473 76119.2 4 0 0 19980102
931 3.29473 3.29473 3.2778 3.29473 263522 4 0 0 19980102 932 3.29473
3.29473 3.2778 3.29473 120384 4 0 0 19980102 933 3.29473 3.29473 3.2633 3.2633 82738.3 4 0 0 19980102 934 3.2633 3.29473 3.2633 3.2778 11169.6 4 0 0 19980102 935 3.29473 3.29473 3.2778 3.2778 1778 41997 0 0 19980102 936 3.2633 3.29473 3.2633 3.2778 3.2778 109628 4 0 0
任何帮助是极大的赞赏
编辑:最后,这是我能想到的最好的解决方案。回想起来,一切都是显而易见的:)
谢谢您的帮助 :)
columnHeadings = ['Date', 'Time', 'Open', 'High', 'Low', 'Close', 'Volume', 'Split Factor', 'Earnings', 'Dividends']
minData = pd.read_csv(
myFile,
header = None,
names = columnHeadings,
parse_dates = [["Date", "Time"]],
date_parser = lambda x: datetime.datetime.strptime(x, '%Y%m%d %H%M'),
index_col = "Date_Time",
sep=' ')
最佳答案
我在使用您的代码时遇到问题,但是以下代码对我有用,并且应该对您进行一些细微的调整,这里的重要步骤是使用strptime从字符串创建日期时间:
导入数据:
minData = pd.read_csv(r'c:\data.txt', parse_dates = [[0,1]], header=None,sep=' ')
minData
Out[17]:
0_1 2 3 4 5 6 7 8 9 10
0 19980102 930 3.29473 3.30923 3.29473 3.29473 76119.2 4 0 0 NaN
1 19980102 931 3.29473 3.29473 3.27780 3.29473 263522.0 4 0 0 NaN
2 19980102 932 3.29473 3.29473 3.27780 3.29473 120384.0 4 0 0 NaN
3 19980102 933 3.29473 3.29473 3.26330 3.26330 82738.3 4 0 0 NaN
4 19980102 934 3.26330 3.29473 3.26330 3.27780 11169.6 4 0 0 NaN
5 19980102 935 3.29473 3.29473 3.27780 3.27780 11997.0 4 0 0 NaN
6 19980102 936 3.26330 3.29473 3.26330 3.27780 109628.0 4 0 0 NaN
[7 rows x 10 columns]
#now convert the string using datetime.datetime.strptime:
# rename the first column (may not be necessary for you)
In [20]:
minData.rename(columns={'0_1':columnHeadings[0], 1:columnHeadings[1]},inplace=True)
minData
Out[20]:
Date 2 3 4 5 6 7 8 9 10
0 19980102 930 3.29473 3.30923 3.29473 3.29473 76119.2 4 0 0 NaN
1 19980102 931 3.29473 3.29473 3.27780 3.29473 263522.0 4 0 0 NaN
2 19980102 932 3.29473 3.29473 3.27780 3.29473 120384.0 4 0 0 NaN
3 19980102 933 3.29473 3.29473 3.26330 3.26330 82738.3 4 0 0 NaN
4 19980102 934 3.26330 3.29473 3.26330 3.27780 11169.6 4 0 0 NaN
5 19980102 935 3.29473 3.29473 3.27780 3.27780 11997.0 4 0 0 NaN
6 19980102 936 3.26330 3.29473 3.26330 3.27780 109628.0 4 0 0 NaN
[7 rows x 10 columns]
# now use strptime to format the string into a datetime object
In [21]:
import datetime
minData['Date'] = minData['Date'].apply(lambda x: datetime.datetime.strptime(x, '%Y%m%d %H%M'))
minData
Out[21]:
Date 2 3 4 5 6 7 8 9 \
0 1998-01-02 09:30:00 3.29473 3.30923 3.29473 3.29473 76119.2 4 0 0
1 1998-01-02 09:31:00 3.29473 3.29473 3.27780 3.29473 263522.0 4 0 0
2 1998-01-02 09:32:00 3.29473 3.29473 3.27780 3.29473 120384.0 4 0 0
3 1998-01-02 09:33:00 3.29473 3.29473 3.26330 3.26330 82738.3 4 0 0
4 1998-01-02 09:34:00 3.26330 3.29473 3.26330 3.27780 11169.6 4 0 0
5 1998-01-02 09:35:00 3.29473 3.29473 3.27780 3.27780 11997.0 4 0 0
6 1998-01-02 09:36:00 3.26330 3.29473 3.26330 3.27780 109628.0 4 0 0
10
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
5 NaN
6 NaN
[7 rows x 10 columns]
#confirm that we have converted the dates:
In [22]:
minData.dtypes
Out[22]:
Date datetime64[ns]
2 float64
3 float64
4 float64
5 float64
6 float64
7 int64
8 int64
9 int64
10 float64
dtype: object
然后可以设置索引:
In [24]:
minData.set_index('Date')
Out[24]:
2 3 4 5 6 7 8 9 \
Date
1998-01-02 09:30:00 3.29473 3.30923 3.29473 3.29473 76119.2 4 0 0
1998-01-02 09:31:00 3.29473 3.29473 3.27780 3.29473 263522.0 4 0 0
1998-01-02 09:32:00 3.29473 3.29473 3.27780 3.29473 120384.0 4 0 0
1998-01-02 09:33:00 3.29473 3.29473 3.26330 3.26330 82738.3 4 0 0
1998-01-02 09:34:00 3.26330 3.29473 3.26330 3.27780 11169.6 4 0 0
1998-01-02 09:35:00 3.29473 3.29473 3.27780 3.27780 11997.0 4 0 0
1998-01-02 09:36:00 3.26330 3.29473 3.26330 3.27780 109628.0 4 0 0
10
Date
1998-01-02 09:30:00 NaN
1998-01-02 09:31:00 NaN
1998-01-02 09:32:00 NaN
1998-01-02 09:33:00 NaN
1998-01-02 09:34:00 NaN
1998-01-02 09:35:00 NaN
1998-01-02 09:36:00 NaN
[7 rows x 9 columns]
关于python - 使用分钟级别的OHLCV数据构建Pandas DataFrame,其中包含930、931、932…17:28、17:29、17:30格式的“时间”列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21459412/