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

Posted

技术标签:

【中文标题】如何有效地重新索引 csv 数据?【英文标题】:How to reindex csv data efficiently? 【发布时间】:2015-04-25 15:19:27 【问题描述】:

我有一个从 Internet 下载的刻度数据文件。它看起来像这样。文件比较“大”

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.

我的问题是:

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

【问题讨论】:

您需要在此处明确定义大/大——稍后您暗示不适合内存,但从一开始就明确说明这一点。我还会考虑更改标题,因为您的问题比标题所建议的要具体得多(您可能仅在标题上就被否决了)。此外,最佳做法是不要导入为 *.对于 pandas,pd 是标准的。 我改了标题。使用 linux wc 命令 17745 17745 825340 XLE.csv 但重新索引需要很长时间,如果我在太多文件上执行它会崩溃。我有 8 GB 或 RAM。 【参考方案1】:

我有点懒得弄清楚这里到底发生了什么,但这会非常慢,因为你是在显式循环而不是使用内置于矢量化方法中的 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 有许多答案可以帮助您解决这个问题,但如果可行的话,购买更多内存始终是最简单的解决方案。

【讨论】:

以上是关于如何有效地重新索引 csv 数据?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:使用循环和分层索引将多个 csv 文件导入数据帧

如何有效地将数据插入索引丰富的 oracle db?

如何以索引方式有效地存储所有 OpenStreetMap 数据?

有效地读取巨大的 csv 文件?

如何有效地将 Postgres 数据从 Query 传输到 S3

Elasticsearch:如何轻松安全地对实时 Elasticsearch 索引重新索引你的数据