2017-01-05 7 views
1

Я работаю с данными временных рядов, и я хотел бы знать, существует ли эффективный способ pythonic &, чтобы проверить, действительна ли последовательность временных меток, связанных с серией. Другими словами, я хотел бы знать, находится ли последовательность временных меток в правильном порядке возрастания без отсутствующих или дублированных значений.Проверка временных меток во временных рядах

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

+0

Что вы имеете в виду под «не хватает»? Вы спросили об эффективности, используете ли вы numpy? –

+0

Отсутствие я имею в виду временные метки, отсутствующие в заданной последовательности. Например, –

+0

Например? Если он не появится в комментарии, отредактируйте вопрос. Собственно отредактируйте вопрос, независимо от того, что было бы лучше для информации. –

ответ

1

numpy.diff может использоваться для определения разницы между последующими отметками времени. Эти дифференциалы могут быть оценены, чтобы определить, являются ли временные метки выглядеть ожидаемому:

import numpy as np 
import datetime as dt 

def errant_timestamps(ts, expected_time_step=None, tolerance=0.02): 
    # get the time delta between subsequent time stamps 
    ts_diffs = np.array([tsd.total_seconds() for tsd in np.diff(ts)]) 

    # get the expected delta 
    if expected_time_step is None: 
     expected_time_step = np.median(ts_diffs) 

    # find the index of timestamps that don't match the spacing of the rest 
    ts_slow_idx = np.where(ts_diffs < expected_time_step * (1-tolerance))[0] + 1 
    ts_fast_idx = np.where(ts_diffs > expected_time_step * (1+tolerance))[0] + 1 

    # find the errant timestamps 
    ts_slow = ts[ts_slow_idx] 
    ts_fast = ts[ts_fast_idx] 

    # if the timestamps appear valid, return None 
    if len(ts_slow) == 0 and len(ts_fast) == 0: 
     return None 

    # return any errant timestamps 
    return ts_slow, ts_fast 


sample_timestamps = np.array(
    [dt.datetime.strptime(sts, "%d%b%Y %H:%M:%S") for sts in (
     "05Jan2017 12:45:00", 
     "05Jan2017 12:50:00", 
     "05Jan2017 12:55:00", 
     "05Jan2017 13:05:00", 
     "05Jan2017 13:10:00", 
     "05Jan2017 13:00:00", 
    )] 
) 

print errant_timestamps(sample_timestamps) 
+0

Большое спасибо Стивену, это действительно ли это работает. Но поскольку манипуляции с временными рядами - такая общая задача, удивительно, что где-то не существует предварительно упакованного решения для этой проблемы ... –

+0

Ну, благодаря удивлению, которое является SO, теперь это предварительно упакованное решение @ https://encrypted.google.com/search?hl=ru&q=Verifying%20timestamps%20in%20a%20time%20series –