我从数据库中下载超过3000种股票的盘中1分钟价格。每条记录都有三个组成部分:
(时间,符号,价格)
我想生成一个pandas.DataFrame,其中行索引是时间,列索引是符号。我的策略是首先构建一个双索引系列,然后将其转换为DataFrame。转换很快。但是,将时间(纪元时间)更改为pandas.DatetimeIndex非常慢,通常需要大约15分钟,因为我首先必须将时间转换为字符串,如“2013-09-23T09:45:00”,然后使用pandas.DatetimeIndex功能。
有更快的方法吗?
答案 0 :(得分:1)
请参阅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