Подсчет непрерывных значений наночастиц в панде Временные ряды - PullRequest
0 голосов
/ 28 сентября 2018

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

Sample data :
                     Valeurs
2018-01-01 00:00:00      1.0
2018-01-01 04:00:00      NaN
2018-01-01 08:00:00      2.0
2018-01-01 12:00:00      NaN
2018-01-01 16:00:00      NaN
2018-01-01 20:00:00      5.0
2018-01-02 00:00:00      6.0
2018-01-02 04:00:00      7.0
2018-01-02 08:00:00      8.0
2018-01-02 12:00:00      9.0
2018-01-02 16:00:00      5.0
2018-01-02 20:00:00      NaN
2018-01-03 00:00:00      NaN
2018-01-03 04:00:00      NaN
2018-01-03 08:00:00      1.0
2018-01-03 12:00:00      2.0
2018-01-03 16:00:00      NaN

Expected results :
       Start_Date      number of contiguous missing values 
2018-01-01 04:00:00      1
2018-01-01 12:00:00      2
2018-01-02 20:00:00      3
2018-01-03 16:00:00      1

Как мне получить этот тип результатов с помощью панд (shift (), cumsum (), groupby () ???)?

Спасибо за ваш совет!

Sylvain

Ответы [ 3 ]

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

groupby и agg

mask = df.Valeurs.isna()
d = df.index.to_series()[mask].groupby((~mask).cumsum()[mask]).agg(['first', 'size'])
d.rename(columns=dict(size='num of contig null', first='Start_Date')).reset_index(drop=True)

            Start_Date  num of contig null
0  2018-01-01 04:00:00                   1
1  2018-01-01 12:00:00                   2
2  2018-01-02 20:00:00                   3
3  2018-01-03 16:00:00                   1
0 голосов
/ 28 сентября 2018

Работа с базовым массивом numpy:

a = df.Valeurs.values
m = np.concatenate(([False],np.isnan(a),[False]))
idx = np.nonzero(m[1:] != m[:-1])[0]

out = df[df.Valeurs.isnull() & ~df.Valeurs.shift().isnull()].index

pd.DataFrame({'Start date': out, 'contiguous': (idx[1::2] - idx[::2])})

            Start date  contiguous
0  2018-01-01 04:00:00           1
1  2018-01-01 12:00:00           2
2  2018-01-02 20:00:00           3
3  2018-01-03 16:00:00           1
0 голосов
/ 28 сентября 2018

Если у вас есть индексы, где встречаются значения, вы можете использовать itertools, как в this , чтобы найти непрерывные порции

...