簡単な答えは、日付/時刻文字列を型インデックスに解析する最速の方法としてあなたが示していることは、datetime
実際に最速の方法です. 私はあなたのアプローチのいくつかと他のいくつかの時間を計りました。これが私が得たものです.
まず、使用する例DataFrame
を取得します。
import datetime
from pandas import *
start = datetime(2000, 1, 1)
end = datetime(2012, 12, 1)
d = DateRange(start, end, offset=datetools.Hour())
t_df = DataFrame({'field_1': np.array(['OFF', 'ON'])[np.random.random_integers(0, 1, d.size)], 'field_2': np.random.random_integers(0, 1, d.size)}, index=d)
どこ:
In [1]: t_df.head()
Out[1]:
field_1 field_2
2000-01-01 00:00:00 ON 1
2000-01-01 01:00:00 OFF 0
2000-01-01 02:00:00 OFF 1
2000-01-01 03:00:00 OFF 1
2000-01-01 04:00:00 ON 1
In [2]: t_df.shape
Out[2]: (113233, 2)
これは約です。ディスクにダンプすると 3.2MB のファイルになります。データの解析方法をシミュレートするためにDataRange
、 your の型を削除しIndex
て のリストにする必要があります。str
t_df.index = t_df.index.map(str)
parse_dates = True
データをDataFrame
usingに読み込むときにを使用read_table
すると、9.5 秒の平均解析時間が表示されます。
In [3]: import numpy as np
In [4]: import timeit
In [5]: t_df.to_csv('data.tsv', sep='\t', index_label='date_time')
In [6]: t = timeit.Timer("from __main__ import read_table; read_table('data.tsv', sep='\t', index_col=0, parse_dates=True)")
In [7]: np.mean(t.repeat(10, number=1))
Out[7]: 9.5226533889770515
DataFrame
他の戦略は、最初にデータを解析して (無視できる解析時間)、次にインデックスをオブジェクトの に変換することIndex
にdatetime
依存しています。
In [8]: t = timeit.Timer("from __main__ import t_df, dateutil; map(dateutil.parser.parse, t_df.index.values)")
In [9]: np.mean(t.repeat(10, number=1))
Out[9]: 7.6590064525604244
In [10]: t = timeit.Timer("from __main__ import t_df, dateutil; t_df.index.map(dateutil.parser.parse)")
In [11]: np.mean(t.repeat(10, number=1))
Out[11]: 7.8106775999069216
In [12]: t = timeit.Timer("from __main__ import t_df, datetime; t_df.index.map(lambda x: datetime.strptime(x, \"%Y-%m-%d %H:%M:%S\"))")
Out[12]: 2.0389052629470825
In [13]: t = timeit.Timer("from __main__ import t_df, np; map(np.datetime_, t_df.index.values)")
In [14]: np.mean(t.repeat(10, number=1))
Out[14]: 3.8656840562820434
In [15]: t = timeit.Timer("from __main__ import t_df, np; map(np.datetime64, t_df.index.values)")
In [16]: np.mean(t.repeat(10, number=1))
Out[16]: 3.9244711160659791
そして今、勝者のために:
In [17]: def f(s):
....: return datetime(int(s[0:4]),
....: int(s[5:7]),
....: int(s[8:10]),
....: int(s[11:13]),
....: int(s[14:16]),
....: int(s[17:19]))
....: t = timeit.Timer("from __main__ import t_df, f; t_df.index.map(f)")
....:
In [18]: np.mean(t.repeat(10, number=1))
Out[18]: 0.33927145004272463
numpy
、pandas
または-type アプローチを使用する場合datetime
、考えるべき最適化が確実に増える可能性がありますが、CPython の標準ライブラリにとどまり、各日付/時刻をs のstr
タプルに変換し、それをインスタンスに変換するのが最速の方法であるように私には思えます。欲しいものを手に入れてください。int
datetime