Przekształcanie nieregularnych pomiarów czasu w równomiernie rozmieszczone średnie ważone czasowo

Mam serię pomiarów, które są znakowane czasem i nieregularnie rozmieszczone. Wartości w tych seriach zawsze reprezentują zmiany pomiaru - tj. Bez zmiany bez nowej wartości. Prostym przykładem takiej serii byłoby:

23:00:00.100     10
23:00:01.200      8
23:00:01.600      0
23:00:06.300      4

To, co chcę osiągnąć, to równomiernie rozmieszczone serie średnich ważonych czasem. Dla danego przykładu mogę celować w częstotliwość opartą na sekundach, a więc wynik taki jak poniżej:

23:00:01     NaN ( the first 100ms are missing )
23:00:02     5.2 ( 10*0.2 + 8*0.4 + 0*0.4 )
23:00:03       0
23:00:04       0
23:00:05       0
23:00:06     2.8 ( 0*0.3 + 4*0.7 )

Szukam biblioteki Pythona rozwiązującej ten problem. Dla mnie jest to standardowy problem, ale nie udało mi się znaleźć takiej funkcjonalności w standardowych bibliotekach, takich jak pandy.

Algorytm musi wziąć pod uwagę dwie rzeczy:

uśrednianie czasowebiorąc pod uwagę wartości przed bieżącym interwałem (a może nawet przed przewagą) przy tworzeniu średniejKorzystanie z pand
data.resample('S', fill_method='pad')          # forming a series of seconds

robi części pracy. Zapewnienie funkcji zdefiniowanej przez użytkownika do agregacji pozwoliaby utworzyć średnie ważone czasem, ale ponieważ początek interwału jest ignorowany, ta średnia również będzie niepoprawna. Co gorsza: dziury w serii są wypełnione wartościami średnimi, co w przykładzie z góry prowadzi do wartości sekund 3, 4 i 5, które mają być niezerowe.

data = data.resample('L', fill_method='pad')   # forming a series of milliseconds
data.resample('S')

robi sztuczkę z pewną dokładnością, ale jest - w zależności od dokładności - bardzo kosztowna. W moim przypadku zbyt drogie.

Edytuj: Rozwiązanie
import pandas as pa
import numpy as np
from datetime import datetime
from datetime import timedelta

time_stamps=[datetime(2013,04,11,23,00,00,100000), 
             datetime(2013,04,11,23,00,1,200000),
             datetime(2013,04,11,23,00,1,600000),
             datetime(2013,04,11,23,00,6,300000)]
values = [10, 8, 0, 4]
raw = pa.TimeSeries(index=time_stamps, data=values)

def round_down_to_second(dt):
    return datetime(year=dt.year, month=dt.month, day=dt.day, 
                    hour=dt.hour, minute=dt.minute, second=dt.second)

def round_up_to_second(dt):
    return round_down_to_second(dt) + timedelta(seconds=1)

def time_weighted_average(data):
    end = pa.DatetimeIndex([round_up_to_second(data.index[-1])])
    return np.average(data, weights=np.diff(data.index.append(end).asi8))

start = round_down_to_second(time_stamps[0])
end = round_down_to_second(time_stamps[-1])
range = pa.date_range(start, end, freq='S')
data = raw.reindex(raw.index + range)
data = data.ffill()

data = data.resample('S', how=time_weighted_average)

questionAnswers(3)

yourAnswerToTheQuestion