python - 在 Python 中制作 pandas.DatetimeIndex 的有效方法

标签 python numpy pandas dataframe

我正在从数据库中下载 3000 多只股票的盘中 1 分钟价格。每条记录将包含三个部分:

(时间、符号、价格)

我想生成一个 pandas.DataFrame,其中行索引是时间,列索引是符号。我的策略是首先构建一个双索引系列,然后将其转换为 DataFrame。转换速度很快。但是,将时间(纪元时间)更改为 pandas.DatetimeIndex 非常非常慢,通常需要大约 15 分钟,因为我首先必须将时间转换为“2013-09-23T09:45:00”之类的字符串,然后使用 pandas.DatetimeIndex功能。

有更快的方法吗?

最佳答案

参见 docs

In [1]: stamps = [ Timestamp('20130101 09:01:01'),Timestamp('20130102 09:10:00') ]

In [2]: stamps
Out[2]: 
[Timestamp('2013-01-01 09:01:01', tz=None),
 Timestamp('2013-01-02 09:10:00', tz=None)]

In [6]: ms_epoch = [ int(s.value/1e6) for s in stamps ]

In [7]: ms_epoch
Out[7]: [1357030861000, 1357117800000]

转换,指定unit='ms'为毫秒数

In [8]: pd.to_datetime(ms_epoch,unit='ms')
Out[8]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 09:01:01, 2013-01-02 09:10:00]
Length: 2, Freq: None, Timezone: None

高效转换 1M 邮票

In [21]: ms_epoch = np.repeat(base,int(1e7)) + np.arange(int(1e7))

In [22]: len(ms_epoch)
Out[22]: 10000000

In [26]: %timeit pd.to_datetime(ms_epoch,unit='ms')
1 loops, best of 3: 1.04 s per loop

In [27]: pd.to_datetime(ms_epoch,unit='ms')[0:5]
Out[27]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 09:00:01, ..., 2013-01-01 09:00:01.004000]
Length: 5, Freq: None, Timezone: None

In [28]: pd.to_datetime(ms_epoch,unit='ms')[-5:]
Out[28]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 11:46:40.995000, ..., 2013-01-01 11:46:40.999000]
Length: 5, Freq: None, Timezone: None

关于python - 在 Python 中制作 pandas.DatetimeIndex 的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18970228/

相关文章:

python - 位置参数跟随关键字参数图形与破折号Python

python - Pandas - 使用列中的特定模式提取字符串

python - 在 python/numpy 中优化矩阵写入

python - 跨文件的全局变量和 numpy 行为

pandas - 使用 Pandas groupby 连接多行中的字符串,并从逗号分隔的单元格中删除重复项

python - 如何在 Pandas 中绘制 groupby 之后的聚合结果?

python - 除了使用 "columns.tolist()"方法之外,如何重新排序我的 Pandas 数据框?我希望特定的列始终出现在最后

Python peewee save() 没有按预期工作

python - 在这段代码中是否有任何 numpy 技巧可以避免 for 循环?

python - 查找回归平面并将其绘制到一组点