我有这种格式的分钟分辨率库存数据


  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/

10-12 19:16