56

そのような形式の .csv ファイルがあります

timestmp, p
2014/12/31 00:31:01:9200, 0.7
2014/12/31 00:31:12:1700, 1.9
...

を介して読み取り、pd.read_csvを使用して時刻 str を datetime に変換するとpd.to_datetime、パフォーマンスが劇的に低下します。これは最小限の例です。

import re
import pandas as pd

d = '2014-12-12 01:02:03.0030'
c = re.sub('-', '/', d)

%timeit pd.to_datetime(d)
%timeit pd.to_datetime(c)
%timeit pd.to_datetime(c, format="%Y/%m/%d %H:%M:%S.%f")

そして、パフォーマンスは次のとおりです。

10000 loops, best of 3: 62.4 µs per loop
10000 loops, best of 3: 181 µs per loop
10000 loops, best of 3: 82.9 µs per loop

pd.to_datetimeでは、csv ファイルから日付を読み取るときのパフォーマンスを改善するにはどうすればよいでしょうか?

4

3 に答える 3

68

これは、dateutil.parser.parseデフォルト以外の形式の場合、またはformat文字列が指定されていない場合に、pandas が文字列を解析するために にフォールバックするためです (これははるかに柔軟ですが、速度も遅くなります)。

format上で示したように、に文字列を指定することでパフォーマンスを向上させることができますto_datetime。または別のオプションを使用することですinfer_datetime_format=True


どうやら、infer_datetime_formatマイクロ秒がある場合は推測できません。それらのない例では、大幅なスピードアップが見られます:

In [28]: d = '2014-12-24 01:02:03'

In [29]: c = re.sub('-', '/', d)

In [30]: s_c = pd.Series([c]*10000)

In [31]: %timeit pd.to_datetime(s_c)
1 loops, best of 3: 1.14 s per loop

In [32]: %timeit pd.to_datetime(s_c, infer_datetime_format=True)
10 loops, best of 3: 105 ms per loop

In [33]: %timeit pd.to_datetime(s_c, format="%Y/%m/%d %H:%M:%S")
10 loops, best of 3: 99.5 ms per loop
于 2015-08-16T12:09:54.043 に答える