Как использовать функцию python timedelta - PullRequest
0 голосов
/ 19 февраля 2020

Я использую приведенную ниже логику c для вычисления среднего значения времени в списке python.

from datetime import datetime,timedelta


def entry_rate(entry_timestamps):
   entry_deltas = [d1-d2 for d1,
                d2 in zip(entry_timestamps[1:], entry_timestamps[:-1])]
   average_timedelta = (sum(entry_deltas, timedelta(
                0)) / len(entry_deltas)).total_seconds() if len(entry_deltas) != 0 else -1.0
   return average_timedelta

Вот входные данные для функции: -

entry_timestamps = [datetime.datetime(2019, 11, 13, 7, 36, 21), datetime.datetime(2019, 11, 13, 7, 40, 53), datetime.datetime(2019, 11, 13, 7, 45, 25), datetime.datetime(2019, 11, 13, 7, 49, 58), datetime.datetime(2019, 11, 13, 7, 54, 30), datetime.datetime(2019, 11, 13, 7, 58, 32), datetime.datetime(2019, 11, 13, 8, 2, 34), datetime.datetime(2019, 11, 13, 8, 6, 36), datetime.datetime(2019, 11, 13, 8, 10, 38), datetime.datetime(2019, 11, 13, 8, 14, 40), datetime.datetime(2019, 11, 13, 8, 18, 42), datetime.datetime(2019, 11, 13, 8, 22, 44), datetime.datetime(2019, 11, 13, 8, 26, 46), datetime.datetime(2019, 11, 13, 8, 29, 18)]

Однако я получаю следующую ошибку.

в prepare_llog (llog_pd) 288 289 result_df ['entry_rate'] = \ -> 290 result_df ['entry_timestamps']. Apply (lambda x: compute_entry_rate (x)) 291 292

~ / miniconda3 / envs / jupyter_21f8c25de0 / lib / python3 .6 / site-packages / pandas / core / series.py в приложении (self, fun c, convert_dtype, args, ** kwds) 4043
else: 4044 values ​​= self.astype (object) .values ​​-> 4045 mapped = lib.map_infer (values, f, convert = convert_dtype) 4046 4047 если len (сопоставленный) и isinstance (сопоставлено [0], серия):

pandas / _libs / lib.pyx в pandas ._ libs.lib.map_infer ()

в (x) 288 289 result_df [' entry_rate '] = \ -> 290 result_df [' entry_timestamps ']. apply (лямбда-x: compute_entry_rate (x)) 291 292

в compute_entry_rate (entry_timestamps) 49 50 Среднее_время_дельта = (сумма ( entry_deltas, timedelta (---> 51 0)) / len (entry_deltas)). total_seconds () если len (entry_deltas)! = 0 иначе -1.0 52 возвращать Average_timedelta 53

TypeError: _ () занимает 1 Позиционный аргумент, но 2 были даны

Может кто-нибудь предложить, пожалуйста, как это исправить?

1 Ответ

1 голос
/ 19 февраля 2020

Вы можете сделать это с помощью pandas следующим образом:

S = pd.Series([datetime.datetime(2019, 11, 13, 7, 36, 21), 
    datetime.datetime(2019, 11, 13, 7, 40, 53), 
    datetime.datetime(2019, 11, 13, 7, 45, 25), 
    datetime.datetime(2019, 11, 13, 7, 49, 58), 
    datetime.datetime(2019, 11, 13, 7, 54, 30), 
    datetime.datetime(2019, 11, 13, 7, 58, 32),
    datetime.datetime(2019, 11, 13, 8, 2, 34),
    datetime.datetime(2019, 11, 13, 8, 6, 36), 
    datetime.datetime(2019, 11, 13, 8, 10, 38), 
    datetime.datetime(2019, 11, 13, 8, 14, 40), 
    datetime.datetime(2019, 11, 13, 8, 18, 42), 
    datetime.datetime(2019, 11, 13, 8, 22, 44), 
    datetime.datetime(2019, 11, 13, 8, 26, 46), 
    datetime.datetime(2019, 11, 13, 8, 29, 18)])

S.diff().mean().total_seconds()

Вывод:

244.384615384

Где, как ваша функция, entry_rate возвращает без ошибок .:

 entry_rate(entry_timestamps)

Выход:

 244.384615

Время:

Использование entry_rate:

5,16 мкс ± 193 нс на л oop (среднее ± стандартное отклонение от 7 прогонов, 100000 циклов каждый)

Использование pandas функций:

389 мкс ± 22,9 мкс на л oop ( среднее ± стандартное отклонение из 7 прогонов, по 1000 циклов в каждом)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...