如何有效地重新索引 csv 数据?

How to reindex csv data efficiently?

我有一个从 Internet 下载的报价数据文件。看起来像这样。文件比较"large"

time,bid,bid_depth,bid_depth_total,offer,offer_depth,offer_depth_total
20150423T014501,81.79,400,400,81.89,100,100
20150423T100001,81.,100,100,84.36,100,100
20150423T100017,81.,100,100,83.52,500,500
20150423T115258,81.01,500,500,83.52,500,500
...

然后我想重新索引数据,以便我可以通过时间类型查询访问它:

from pylab import *
from pandas import *
import pandas.io.date_converters as conv

XLE = read_csv('XLE.csv') # Chunking seems somewhat kludy XLE = pd.read_csv('XLE.csv', chunksize=4)
#preferred something like XLE = pd.read_csv('XLE.csv', index_col=0, parse_dates=True) but can't handle this time format?

XLE = XLE.drop_duplicates(cols='time')

for i in XLE.index :
    XLE [ 'time' ][ i ]= datetime.strptime ( XLE [ 'time' ][ i], '%Y%m%dT%H%M%S')
XLE.index = XLE [ ' time ' ]; del XLE [ 'time']

print XLE[['bid','offer']].ix[1000:1015].to_string() # this is the goal, to be able to manipulate the data through a time index.

我的问题是:

  1. 当我在 shell 中 运行 时,即使是一个文件也需要相当多的时间。我确定我的方法一定是做错了,因为目标是读取许多文件并将它们合并到 pandas DataFrame/Timeseries
  2. Pandas 似乎是一种内存类型的方法。当文件真的很大并且不能全部放入内存时,人们会怎么做?是否有一个 pandas 接口隐藏在数据实际驻留的 pandas 中,以便随着计算的进行根据需要从磁盘加载和卸载文件?
  3. 将过滤器应用于时间列似乎更合乎逻辑,因为它正在被读入,然后稍后对其进行操作。有没有办法通过告诉读取函数在读取列时调用什么函数来做到这一点,将对象存储在内存中之前?

我有点懒得弄清楚这里到底发生了什么,但这会非常慢,因为您是显式循环而不是使用 pandas 内置的矢量化方法。 (基本上在使用pandas的时候尽量避免使用'for',如果可能的话,通常是可以的。)

for i in XLE.index :
    XLE [ 'time' ][ i ]= datetime.strptime ( XLE [ 'time' ][ i], '%Y%m%dT%H%M%S')
XLE.index = XLE [ ' time ' ]; del XLE [ 'time']

您可以很容易地将时间转换为 pandas 日期时间:

XLE['time'] = pd.to_datetime(XLE.time)

我不确定为什么 parse_datesread_csv 在那里不适合你,但你也可以使用 date_parser 并以这种方式指定特定格式。

那么如果你想让它成为索引:

XLE = XLE.set_index('time')

这应该可以帮助您入门。一旦 'time' 是 pandas 日期时间,您就可以做各种事情(请参阅文档)。如果事情适合记忆,这些事情应该非常快。如果没有,SO 上有许多答案可以帮助您解决这个问题,尽管如果可行的话,购买更多内存始终是最简单的解决方案。