2013-09-23 3 views
2

Je télécharge des prix infrajournaliers de 1 minute pour plus de 3000 actions à partir d'une base de données. chaque enregistrement comportera trois volets:façon efficace de faire pandas.DatetimeIndex en Python

(temps, symbole, prix)

Je voudrais générer un pandas.DataFrame où l'indice de ligne est le temps et l'index colonne est le symbole. Ma stratégie consiste à construire d'abord une série indexée double et ensuite le convertir en un DataFrame. La conversion est rapide. Cependant, changer l'heure (epoch time) en pandas.DatetimeIndex est très très lent, cela prend généralement environ 15 minutes parce que je dois d'abord convertir l'heure en une chaîne comme "2013-09-23T09: 45: 00" et ensuite utiliser pandas.DatetimeIndex fonction.

Existe-t-il un moyen plus rapide de faire cela?

Répondre

1

voir 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] 

La conversion, spécifiez unit='ms' pour milliseond

époques
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 

Convertir timbres 1M efficacement

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 
+0

Merci Jeff, ce qui est très très utile – yuez

Questions connexes