прекратить повторную выборку в пандах, если промежуток между двумя датами превышает определенное условие - PullRequest
0 голосов
/ 24 июня 2018

У меня есть этот фрейм данных.Мой фрейм данных содержит ID, время и значение и пробелы (час).Я делаю повторную выборку независимо от каждого идентификатора.Столбец Gaps содержит последовательные промежутки времени между двумя разными временами.Я делаю повторную выборку каждые 10 минут, и я хочу прекратить повторную выборку, если последовательные разрывы превышают 0,86 ч, вернуть следующие строки как исходные и продолжить повторную выборку снова, когда он обнаружит те же условия.мои условия гэпов подходят так:

a (abs(a-b))
b  0

Пример данных

ID,Time,Value,Gaps
1,1523147332607,2,0.3347541666666667
1,1523148537722,5,0.17346666666666666
1,1523149162202,6,1.6252830555555555
1,1523155013221,4,0.33290027777777775
1,1523156211662,7,0.3722580555555556
1,1523157551791,10,0.0
2,1523156211662,5,0.5115911111111111
2,1523158053390,2,0.3405525
2,1523159279379,9,1.3295477777777778
2,1523164065751,3,0.0

Как вы можете видеть, ID 1 имеет разрывы более 0,86 ч, поэтому моя идея - остановить повторную выборкув таком случае.Примерно так:

ID,Time,Value,Gaps
1,1523147332607,2,0.3347541666666667
...................................
1,1523148537722,5,0.17346666666666666
...................................
...................................
1,1523149162202,6,1.6252830555555555

Итак, я хочу продолжить повторную выборку до этого Time period 1523149162202, а когда больше нет необходимости делать выборку, я хочу вернуть последние строки как оригинальные, т.е.

1,1523149162202,6,1.6252830555555555

И после этого я хочу продолжить повторную выборку из следующих строк

1,1523155013221,4,0.33290027777777775
1,1523156211662,7,0.3722580555555556
1,1523157551791,10,0.0

, и это продолжается

Для обычной повторной выборки для каждого идентификатора,

 df = df.set_index(['Time'])
 df.index = pd.to_datetime(df.index, unit='ms')

 df = (df.groupby('ID', axis=0)['Value']
       .resample('10min')
        .mean()
        .groupby(level=0)
        .apply(lambda x: x.interpolate()).reset_index())

Но как мне отследить каждую повторную выборку, чтобы я мог остановить повторную выборку, когда она удовлетворяет некоторым условиям, и вернуть исходные строки на концах для этой части повторной выборки.И затем он продолжает из следующих строк снова те же критерии.Я думал использовать np.where, но я не близко к этому.Какие-либо предложения ?

1 Ответ

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

Одним из способов может быть создание временного столбца 'ID_res' в df, увеличение числа при изменении идентификатора или в строке после пробелов более 0,86, например:

df.loc[(df['ID'] != df['ID'].shift())| (df['Gaps'].shift() > 0.86),'ID_res'] = 1
df['ID_res'] = df['ID_res'].cumsum().ffill()

так ваш df выглядит так:

                         ID  Value      Gaps  ID_res
Time                                                
2018-04-08 00:28:52.607   1      2  0.334754     1.0
2018-04-08 00:48:57.722   1      5  0.173467     1.0
2018-04-08 00:59:22.202   1      6  1.625283     1.0
2018-04-08 02:36:53.221   1      4  0.332900     2.0
2018-04-08 02:56:51.662   1      7  0.372258     2.0
2018-04-08 03:19:11.791   1     10  0.000000     2.0
2018-04-08 02:56:51.662   2      5  0.511591     3.0
2018-04-08 03:27:33.390   2      2  0.340553     3.0
2018-04-08 03:47:59.379   2      9  1.329548     3.0
2018-04-08 05:07:45.751   2      3  0.000000     4.0

Теперь вы можете использовать метод, который вы указали, выполнив первый групповой вызов для 'ID_res', сохранив оба столбца 'ID' и 'Value', и отбросив столбец 'ID_res' в конце, так как он вам больше не нужен:

df = (df.groupby('ID_res', axis=0)['ID','Value'].resample('10min').mean()
        .groupby(level=0).apply(lambda x: x.interpolate())
        .reset_index().drop('ID_res',1))

Результат выглядит так:

                  Time   ID  Value
0  2018-04-08 00:20:00  1.0    2.0
1  2018-04-08 00:30:00  1.0    3.5
2  2018-04-08 00:40:00  1.0    5.0
3  2018-04-08 00:50:00  1.0    6.0
4  2018-04-08 02:30:00  1.0    4.0
5  2018-04-08 02:40:00  1.0    5.5
6  2018-04-08 02:50:00  1.0    7.0
...

В случае, если у вас нет повторной выборки между строками 3 и 4, «разрыв» между этими значениями в оригинале был более 0,86 df

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