Эффективный калькулятор timedelta - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть данные временного ряда из регистратора данных, который ставит метки времени (в виде дат ММ - ДД-ГГ ЧЧ: ММ: СС: ххх: ггг (например, - [29.08.2018 16:26: 31.406] -) где xxx и yyy - миллисекунды и микросекунды соответственно) с точностью до микросекунд при записи данных. Теперь вы можете представить, что сгенерированный файл, записанный за несколько минут, может быть очень большим. (100 мегабайт). Мне нужно построить кучу данных из этого файла в зависимости от времени в миллисекундах (в идеале). Данные выглядят как ниже: Snapshot of datafile

Так что мне нужно проанализировать эти даты в python и вычислить timedelta, чтобы найти промежуток времени между выборками, а затем сгенерировать графики. Например, когда я вычитаю эти две метки времени (- [29.08.2018 16: 23: 41.052] - и - [29.08.2018 16: 23: 41.114] -), я хочу получить 62 миллисекунды за промежуток времени между эти две метки времени.

В настоящее время я использую 'dateparser' (при импорте dateparser как dp), который выводит datetime после синтаксического анализа, а затем я могу вычесть их, чтобы извлечь timedelta, а затем преобразовать в мс или секунды, как мне нужно. Но эта функция занимает слишком много времени и является узким местом в моем сценарии постобработки.

Кто-нибудь может предложить лучшую библиотеку, которая более эффективна в разборе дат и вычислении timedelta?

Вот фрагмент кода, который не так эффективен

import dateparser as dp
def timedelta_local(date1, date2):
import dateparser as dp
timedelta = dp.parse(date2)-dp.parse(date1)
timediff={'us': timedelta.microseconds+timedelta.seconds*1000000+timedelta.days*24*60*60*1000000,
          'ms':timedelta.microseconds/1000+timedelta.seconds*1000+timedelta.days*24*60*60*1000,
          'sec': timedelta.microseconds/1000000+timedelta.seconds+timedelta.days*24*60*60,
          'minutes': timedelta.microseconds/1000000/60+timedelta.seconds/60+timedelta.days*24*60
         }
return timediffe

Заранее спасибо

1 Ответ

0 голосов
/ 04 сентября 2018

@ Звон здесь прав. Панды твой лучший друг для этого. Вот пример кода, который, мы надеемся, поможет вам в правильном направлении. Предполагается, что ваши данные находятся в CSV-файле со строкой заголовка, подобной той, которую вы показываете в своем примере. Я не был уверен, хотите ли вы сохранить разницу во времени как объект timedelta (легко выполнить дальнейшую математику с помощью) или просто упростить его до числа с плавающей точкой. Я сделал оба.

import pandas as pd

df = pd.read_csv("test.csv", parse_dates=[0])

# What are the data types after the initial import?

print(f'{df.dtypes}\n\n')

# What are the contents of the data frame?

print(f'{df}\n\n')

# Create a new column that strips away leading and trailing characters 
# that surround the data we want

df['Clean Time Stamp'] = df['Time Stamp'].apply(lambda x: x[3:-4])

# Convert to a pandas Timestamp. Use infer_datetime_format for speed.

df['Real Time Stamp'] = pd.to_datetime(df['Clean Time Stamp'], infer_datetime_format=True)

# Calculate time difference between successive rows

df['Delta T'] = df['Real Time Stamp'].diff()

# Convert pandas timedelta to a floating point value in milliseconds.

df['Delta T ms'] = df['Delta T'].dt.total_seconds() * 1000

print(f'{df.dtypes}\n\n')
print(df)

Вывод выглядит так. Обратите внимание, что печать информационного кадра переносит столбцы в другую строку - это всего лишь артефакт его печати. ​​

Time Stamp     object
 Limit A        int64
 Value A      float64
 Limit B        int64
 Value B      float64
dtype: object


                         Time Stamp   Limit A   Value A   Limit B   Value B
0  --[ 29.08.2018 16:23:41.052 ] --        15     3.109        30     2.907
1  --[ 29.08.2018 16:23:41.114 ] --        15     3.020        30     8.242


Time Stamp                   object
 Limit A                      int64
 Value A                    float64
 Limit B                      int64
 Value B                    float64
Clean Time Stamp             object
Real Time Stamp      datetime64[ns]
Delta T             timedelta64[ns]
Delta T ms                  float64
dtype: object


                         Time Stamp   Limit A   Value A   Limit B   Value B  \
0  --[ 29.08.2018 16:23:41.052 ] --        15     3.109        30     2.907   
1  --[ 29.08.2018 16:23:41.114 ] --        15     3.020        30     8.242   

            Clean Time Stamp         Real Time Stamp         Delta T  \
0   29.08.2018 16:23:41.052  2018-08-29 16:23:41.052             NaT   
1   29.08.2018 16:23:41.114  2018-08-29 16:23:41.114 00:00:00.062000   

   Delta T ms  
0         NaN  
1        62.0  

Если ваши файлы большие, вы можете получить некоторую эффективность, редактируя столбцы вместо создания новых, как я.

...