- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正致力于使用 python 和 pytables 以及相当大的数据集 (+200GB) 制作 future 市场报价数据重播系统。
据我所知,pytables 只能为我的时间戳存储 numpy datetime64 对象。这是一个问题,因为我需要将它们转换为日期时间对象或 pandas 时间戳,以便交易模块可以对传入数据调用时间、工作日或月份等方法。试图在运行时转换数十亿行基本上会使系统无法使用。
pd.to_datetime(my_datetime64)
datetime.datetime(my_datetime64)
都太慢了。
以下是我将数千个原始 csvs 导入 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/
给定一个带有多个 date_time 戳的字符串,我想 提取第一个戳及其前面的文本 候选字符串可以有一个或多个时间戳 后续的 date_time 戳记将被 sep="-" 隔开 后续date_time
是否可以合并从相机拍摄的文本和照片?我想在照片上标记日期和时间,但我在 Google 上找不到任何内容。 最佳答案 使用下面的代码来实现你所需要的。 Bitmap src = Bitm
有没有办法通过 Graph API 戳另一个用户?基于this post ,并使用 Graph Explorer ,我发布到“/USERID/pokes”,我已经授予它(Graph API 应用程序和
我有两个向左浮动的元素。一个是 body 的第一个 child ,另一个是容器的第一个 child ,容器是 body 的第二个 child 。 ...
我是一名优秀的程序员,十分优秀!