python - 加快Python时间戳到日期时间的转换

标签 python datetime cython hdf5 pytables

我正在致力于使用 python 和 pytables 以及一个相当大的数据集(+200GB)制作一个 future 市场报价数据重放系统。

据我所知,pytables 只能存储我的时间戳的 numpy datetime64 对象。这是一个问题,因为我需要将它们转换为日期时间对象或 pandas 时间戳,以便交易模块可以对传入数据调用时间、工作日或月份等方法。尝试在运行时转换数十亿行基本上会使系统无法使用。

pd.to_datetime(my_datetime64)
datetime.datetime(my_datetime64)

都太慢了。

以下是我将数千个原始 csv 导入 pytables 存储的方法。请注意,索引采用 pandas 日期时间格式,这使我能够获取有关时间戳的信息,例如时间、月份、年份等

from pandas import HDFStore
store = HDFStore(store_dir)

for file in files:
            df = pd.read_csv("/TickData/"+file)
            df.index = pd.to_datetime(df['date'].apply(str) + " " + df['time'], format = '%Y%m%d %H:%M:%S.%f')
            df.drop(['date', 'time'], axis=1, inplace=True)
            store.append('ticks', df, complevel=9, complib='blosc')

这是我使用 PyTables table.read 方法读回一个 block 时的数据 - 您可以看到 pandas 时间戳全部转换为 datetime64

array([(1220441851000000000, [b'ESU09'], [1281.0], [1]),
       (1226937439000000000, [b'ESU09'], [855.75], [2]),
       (1230045292000000000, [b'ESU09'], [860.0], [1]), ...,
       (1244721917000000000, [b'ESU09'], [943.75], [1]),
       (1244721918000000000, [b'ESU09'], [943.75], [2]),
       (1244721920000000000, [b'ESU09'], [944.0], [15])], 
      dtype=[('index', '<i8'), ('values_block_0', 'S5', (1,)), ('values_block_1', '<f8', (1,)), ('values_block_2', '<i8', (1,))])

这是我如何从表中分块读取它们

    chunksize = 100000
    nrows = 1000000000
    n_chunks =  nrows//chunksize + 1
    h5f = tables.open_file(store_directory, 'r')
    t = h5f.get_node('/', 'ticks')

    for i in range(n_chunks):
         chunk = t.table.read(i*chunksize, (i+1)*chunksize)
             for c in chunk:
                  #this is where we would convert c[0] which is the timestamp , 
pd.to_datetime(c[0]) or datetime.datetime(c[0]), both are too slow

我的问题最终是:

1:是否有更快的方法将 datetime64 转换回日期时间或 pandas 时间戳,也许与 cython 有关?

或 2:有没有办法将 pandas 时间戳存储在 HDF 中,以便它们在读取时不需要转换?

谢谢

最佳答案

试试这个:

import numpy
from datetime import datetime

npdt = numpy.datetime64(datetime.utcnow())
dt = npdt.astype(datetime)

我发现它的速度快了一个数量级:

from datetime import datetime
import numpy
import pandas
import timeit

foo = numpy.datetime64(datetime.utcnow())
print(foo.astype(datetime))
print(pandas.to_datetime(foo))

print(timeit.timeit('foo.astype(datetime)',    setup='import numpy; import pandas; from datetime import datetime; foo = numpy.datetime64(datetime.utcnow())'))
print(timeit.timeit('pandas.to_datetime(foo)', setup='import numpy; import pandas; from datetime import datetime; foo = numpy.datetime64(datetime.utcnow())'))

输出:

2016-06-10 20:51:11.745616
2016-06-10 20:51:11.745616
1.916042190976441
37.38387820869684

关于python - 加快Python时间戳到日期时间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37756648/

相关文章:

python - 如何在不使用 for 循环的情况下注释/聚合列表中的每个项目 (Django)

python - 语法错误和运行时错误有什么区别?

Mysql日期时间格式错误

python-3.x - pxd 相对 cimport 适用于 language_level 2,但不适用于 language_level 3

python - 加速cython代码

python - 如何将文件存储在 Google Storage 上,但跳过 GAME 部分来获取它们?

Python - 更好的循环解决方案 - 出现错误后重新运行并在 3 次尝试后忽略该错误

python - 向日期时间添加秒数

过去 24 小时内最受欢迎的 PHP MySQL 查询

python - Cython 弱引用存储在 C 对象中的 cdef 类