Пересчет и выполнение линейной интерполяции в пандах - PullRequest
0 голосов
/ 06 июня 2018

У меня есть данные, которые содержат Id, DateTime and Value столбец.Данные должны собираться каждые 10 минут.Тем не менее, есть некоторые данные, которые имеют разрывы более 10 минут (например, разрывы более 20 минут, 1 час, 2 часа).Данные собираются за один полный месяц.Я хочу использовать повторную выборку и использовать линейную интерполяцию на моем Value Column, чтобы каждый Value columns содержал данные за фиксированный интервал времени (скажем, для каждого 1 часа и (еженедельно)).

Это мои образцы данных

 Id DateTime              Value
20  2018-04-08 00:28:52     10
20  2018-04-08 00:38:34     11  
20  2018-04-08 00:48:57     9
20  2018-04-08 01:18:22     7   
............................
205  2018-04-08 01:08:28    11
205  2018-04-08 01:18:33    13
205  2018-04-08 01:27:22    8
205  2018-04-08 01:37:02    7
205  2018-04-08 01:56:44    6
205  2018-04-08 02:16:14    10

.....
2053  2018-04-08 02:06:03   11
2053  2018-04-08 02:17:10   12
2053  2018-04-08 02:26:33   8
2053  2018-04-08 02:36:53   9
2053  2018-04-08 03:26:33   13

Есть предложения?Спасибо

1 Ответ

0 голосов
/ 06 июня 2018

Я считаю, что нужно:

print (df)

      Id            DateTime  Value
0     20 2018-04-08 00:28:52     10
1     20 2018-04-08 00:38:34     11
2     20 2018-04-08 00:48:57      9
3     20 2018-04-08 01:18:22      7
4    205 2018-04-08 01:08:28     11
5    205 2018-04-08 01:18:33     13
6    205 2018-04-08 01:27:22      8
7    205 2018-04-08 01:37:02      7
8    205 2018-04-08 01:56:44      6
9    205 2018-04-08 02:16:14     10
10  2053 2018-04-08 10:06:03     11
11  2053 2018-04-08 10:17:10     12
12  2053 2018-04-08 10:26:33      8
13  2053 2018-04-08 10:36:53      9
14  2053 2018-04-08 10:26:33     13

df = df.set_index('DateTime')['Value'].resample('1H').mean().interpolate()
print (df)

DateTime
2018-04-08 00:00:00    10.000000
2018-04-08 01:00:00     8.666667
2018-04-08 02:00:00    10.000000
2018-04-08 03:00:00    10.075000
2018-04-08 04:00:00    10.150000
2018-04-08 05:00:00    10.225000
2018-04-08 06:00:00    10.300000
2018-04-08 07:00:00    10.375000
2018-04-08 08:00:00    10.450000
2018-04-08 09:00:00    10.525000
2018-04-08 10:00:00    10.600000
Freq: H, Name: Value, dtype: float64

РЕДАКТИРОВАТЬ:

При необходимости resample для групп также добавить groupby с reindex для того же DatetimeIndex для каждого уникального Id s:

df = df.set_index('DateTime').groupby('Id')['Value'].resample('1H').mean()
mux = pd.MultiIndex.from_product([df.index.levels[0], pd.date_range(df.index.levels[1].min(), df.index.levels[1].max(), freq='h')])
df = df.reindex(mux)
df = df.groupby(level=0).apply(lambda x: x.interpolate())

print (df)

20    2018-04-08 00:00:00    10.0
      2018-04-08 01:00:00     7.0
      2018-04-08 02:00:00     7.0
      2018-04-08 03:00:00     7.0
      2018-04-08 04:00:00     7.0
      2018-04-08 05:00:00     7.0
      2018-04-08 06:00:00     7.0
      2018-04-08 07:00:00     7.0
      2018-04-08 08:00:00     7.0
      2018-04-08 09:00:00     7.0
      2018-04-08 10:00:00     7.0
205   2018-04-08 00:00:00     NaN
      2018-04-08 01:00:00     9.0
      2018-04-08 02:00:00    10.0
      2018-04-08 03:00:00    10.0
      2018-04-08 04:00:00    10.0
      2018-04-08 05:00:00    10.0
      2018-04-08 06:00:00    10.0
      2018-04-08 07:00:00    10.0
      2018-04-08 08:00:00    10.0
      2018-04-08 09:00:00    10.0
      2018-04-08 10:00:00    10.0
2053  2018-04-08 00:00:00     NaN
      2018-04-08 01:00:00     NaN
      2018-04-08 02:00:00     NaN
      ... 
      2018-04-08 07:00:00     NaN
      2018-04-08 08:00:00     NaN
      2018-04-08 09:00:00     NaN
      2018-04-08 10:00:00    10.6
Name: Value, dtype: float64

Другое решение, если необходимо interpolate каждая группа отдельно:

df = (df.set_index('DateTime')
       .groupby('Id')['Value']
       .resample('1H')
       .mean()
       .groupby(level=0)
       .apply(lambda x: x.interpolate()))

print (df)


Id    DateTime           
20    2018-04-08 00:00:00    10.0
      2018-04-08 01:00:00     7.0
205   2018-04-08 01:00:00     9.0
      2018-04-08 02:00:00    10.0
2053  2018-04-08 10:00:00    10.6
Name: Value, dtype: float64
...