1

パフォーマンス プロファイリングを実行したところ、パフォーマンスにpd.to_datetime大きな影響を与えていることがわかり、非常に驚​​きました (私のユース ケースでは 91 秒のうち 62 秒が費やされました)。そのため、機能を適切に使用していない可能性があります。

簡単な例timestamp = 623289600000000000Lでは、日付/タイムスタンプ形式に変換する必要があります。

import datetime
import time
import pandas as pd
timestamp = 623289600000000000L

timeit pd.to_datetime(timestamp, unit = 'ns')
10000 loops, best of 3: 46.9 us per loop

In [3]: timeit time.ctime(timestamp/10**9)
1000000 loops, best of 3: 904 ns per loop

timeit time.localtime(timestamp/10**9)
1000000 loops, best of 3: 1.13 us per loop

timeit datetime.datetime.fromtimestamp(timestamp/10**9)
1000000 loops, best of 3: 1.51 us per loop

timeit datetime.datetime.utcfromtimestamp(timestamp/10**9)
1000000 loops, best of 3: 1.29 us per loop

これらの関数はそれぞれ異なるオブジェクトを返しますpd.to_datetimeが、はるかに遅いことは承知しています。それは期待されていますか?

私は今datetime.datetime.utcfromtimestamp自分のコードで使用していますが、正常に動作します。ただし、Pandas を使い続けたいと思います。さらに、Pandas は 1970 年より前の日付を適切に処理します (以下を参照)。どなたかご指南いただけないでしょうか。

pd.to_datetime1 つの利点があります。負の入力/1970-01-01 より前の日付をサポートすることです。これは、私のユースケースでも非常に重要です。

timestamp =-445645400000000000L
pd.to_datetime(timestamp, unit = 'ns')
Timestamp('1955-11-18 01:36:40', tz=None)

datetime.datetime.utcfromtimestamp(timestamp/10**9)
Traceback (most recent call last):

  File "<ipython-input-9-99b040d30a3e>", line 1, in <module>
    datetime.datetime.utcfromtimestamp(timestamp/10**9)

ValueError: timestamp out of range for platform localtime()/gmtime() function

Windows 7 で Python 2.7.5 と Pandas 0.12.0 を使用しています。

4

3 に答える 3

4

変換する日時値が重複している場合、パンダで次の関数を使用して日付解析を行うと、処理が非常に高速になります。

ベンチマーク:

$ python date-parse.py
to_datetime: 5799 ms
dateutil:    5162 ms
strptime:    1651 ms
manual:       242 ms
lookup:        32 ms

def lookup(s):
    """
    This is an extremely fast approach to datetime parsing.
    For large data, the same dates are often repeated. Rather than
    re-parse these, we store all unique dates, parse them, and
    use a lookup to convert all dates.
    """
    dates = {date:pd.to_datetime(date) for date in s.unique()}
    return s.apply(lambda v: dates[v])

そして、ソース。

于 2015-04-25T21:20:44.183 に答える
1

単一のタイムスタンプを変換することは有効な比較ではなく、関数呼び出しの数の尺度に過ぎません。

In [9]: arr = [timestamp] * 1000000

In [10]: %timeit pd.to_datetime(arr,unit='ns')
1 loops, best of 3: 234 ms per loop

In [12]: arr = (np.array(arr)/10**9).tolist()

In [13]: %timeit [ time.ctime(x) for x in arr ]
1 loops, best of 3: 1.6 s per loop

In [31]: f = datetime.datetime.utcfromtimestamp

In [32]: %timeit [ f(x) for x in arr ]
1 loops, best of 3: 643 ms per loop

自明でないデータセットに適用すると、ベクトル化されたアプローチを使用する方がはるかに高速であることは明らかです。

于 2013-10-31T11:24:49.953 に答える