Серия Pandas: выбираете индекс наибольшего значения за день? - PullRequest
0 голосов
/ 15 мая 2018

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

import pandas as pd
from datetime import datetime
ts1 = pd.Series([1, 2, 4, 3],
                 index=[datetime(2011,1,2,1,1,1),   # first day
                        datetime(2011,1,2,2,2,2),
                        datetime(2011,1,3,1,1,1),   # second day
                        datetime(2011,1,3,4,4,4)])

Как выполнить итерацию по этой серии, чтобы я получал один индекс для каждой даты сэтот индекс соответствует наибольшему значению для этой даты?

. Для приведенного выше примера я бы хотел, чтобы итерация охватывала следующие значения:

datetime(2011,1,2,2,2,2)   # highest value on 2011-1-2 is 2
datetime(2011,1,3,1,1,1)   # highest value on 2011-1-3 is 4

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Давайте попробуем duplicated

ts1=ts1.sort_values()
ts1[ts1.index.astype(str).str[:10].duplicated()]
Out[381]: 
2011-01-02 02:02:02    2
2011-01-03 01:01:01    4
dtype: int64
0 голосов
/ 15 мая 2018

Позвоните groupby.max, используя pd.Grouper объект с частотой 'D' в течение дней.

ts1.groupby(pd.Grouper(freq='D')).max()

2011-01-02    2
2011-01-03    4
Freq: D, dtype: int64

Или floor индекс перед группировкой -

ts1.groupby(ts1.index.floor('D')).max()

2011-01-02    2
2011-01-03    4
dtype: int64

Или, наконец, запрос date из индекса -

ts1.groupby(ts1.index.date).max()

2011-01-02    2
2011-01-03    4
dtype: int64

Если вы делаете это с Series, а не Index, вам нужно будет вызывать эти функции через аксессор .dt.


Если вы хотите максимальное значение с индексом , используйте вместо него idxmax, а затем индексируйте ts1 с помощью loc—

ts1.loc[ts1.groupby(pd.Grouper(freq='D')).idxmax()]

2011-01-02 02:02:02    2
2011-01-03 01:01:01    4
dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...