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

标签 python pandas bigdata

我有一个从互联网下载的蜱数据文件。看起来像这样。文件比较“大”

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 接口(interface)可以隐藏数据实际所在的 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')

这应该可以帮助你开始。一旦“时间”是 pandas 日期时间,您就可以做各种各样的事情(只需参阅文档)。如果内存适合的话,这些事情应该很快。如果没有,SO 上有很多答案可以帮助您解决这个问题,尽管如果可行的话,购买更多内存始终是最简单的解决方案。

关于python - 如何有效地重新索引 csv 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29867012/

相关文章:

mysql - 'latin- 1' codec can' t 编码字符 u'\u2014' 在位置 23 : ordinal not in range(256)

python - Pandas - 跳过 numpy 数组中给定的行数

python - 在Hive数据库中匹配两个字段的最有效方法

python - 使用 GeoPandas 在 map 上绘制点组会生成空白图像

python - 如何生成具有多个范围的随机整数?

python - Beautifulsoup - 抓取网页 - 动态加载页面

python - 嵌套字典到 MultiIndex pandas DataFrame(3 级)

hadoop - 带 RAID 的 HDP 集群?

php - 如何遍历一个3500万行的表——Mysql

python - 如何提高索贝尔边缘检测器的效率