Как получить дневную разницу в значениях временных рядов, когда индекс временной дельты нерегулярен в pandas? - PullRequest
1 голос
/ 26 мая 2020

У меня есть фрейм данных, содержащий временной ряд, проиндексированный по времени, но с нерегулярными временными дельтами, как показано ниже

df
time                  x
2018-08-18 17:45:08   1.4562
2018-08-18 17:46:55   1.4901
2018-08-18 17:51:21   1.8012
...
2020-03-21 04:17:19   0.7623
2020-03-21 05:01:02   0.8231
2020-03-21 05:02:34   0.8038

Я хочу получить дневную разницу между двумя (хронологически) ближайшими значения , т.е. ближайшее время следующего дня. Например, если у нас есть образец во время 2018-08-18 17:45:08, а на следующий день у нас нет образца в то же время, но ближайший образец находится, скажем, в 2018-08-19 17:44:29, тогда я хочу получить разницу в x между этими двумя временами. Как это возможно в pandas?

  • Всегда будет выборка для каждого дня между первым и последним днями временного ряда.
  • Следует учитывать разницу as (текущий x) - (прошедший x) например x_day2 - x_day1
  • Первые n строки вывода будут иметь NaN с учетом того, как берется разница, где n - количество выборок в первый день

РЕДАКТИРОВАТЬ: Приведенный ниже код работает, если временные дельты являются регулярными

def get_daily_diff(data):
    """
    Calculate daily difference in time series

    Args:
        data (pandas.Series): a pandas series of time series values indexed by pandas.Timestamp

    Returns:
        pandas.Series: daily difference in values
    """
    df0 = data.index.searchsorted(data.index - pd.Timedelta(days=1))
    df0 = df0[df0 > 0]
    df0 = pd.Series(data.index[df0 - 1], index=data.index[data.shape[0] - df0.shape[0]:])
    out = data.loc[df0.index] - data.loc[df0.values]
    return out

Однако, если используются нерегулярные временные дельты, ValueError выбрасывается при определении переменной out, поскольку мы получаем несоответствие длины между data.loc[df0.index] и data.loc[df0.values]. Таким образом, проблема состоит в том, чтобы расширить эту функцию, чтобы она работала, когда временные дельты нерегулярны.

1 Ответ

1 голос
/ 26 мая 2020

Я бы использовал pd.merge_asof с direction='nearest':

df['time_1d'] = df['time']+pd.Timedelta('1D')
tmp = pd.merge_asof(df, df, left_on='time', right_on ='time_1d',
           direction='nearest', tolerance=pd.Timedelta('12H'), suffixes=('', '_y'))
tmp['delta'] = tmp['x_y'] - tmp['x']
tmp = tmp[['time', 'x', 'delta']]

Здесь я использовал допуск 12H, чтобы убедиться, что NaN в первые дни, но вы можете использовать более подходящее значение.

...