создайте почасовой интервал и выполните цикл, чтобы получить значение питонской панды питона - PullRequest
1 голос
/ 14 октября 2019

У меня есть фрейм данных с datetimeindex с 2019-04-25 15:00:00 до 2019-04-26 15: 00: 00

за каждый час, когда я хочу найти df ["mode"].value_counts (), чтобы увидеть, сколько счетчиков режима существует каждый час.

так между_тем ("08:00", "08:02"), между_тем ("09:00", "09:02") ,ween_time ("10:00", "10:02") и т. д. ...

мой фрейм данных выглядит примерно так:

                        serial_number     mode
gps_updated_at

2019-04-26 15:01:00       A               standby
2019-04-26 15:02:00       A               standby
2019-04-26 15:02:00       B               standby
2019-04-26 15:02:00       B               good
2019-04-26 16:00:00       B               good
2019-04-26 16:01:00       C               bad

, поэтому для каждого часа, который я хочуполучить (15:00:00)

standby  3
good     1

и 16: 00: 00

good      1
bad       1

Как сделать эффективный цикл for для увеличения на час.

Ответы [ 2 ]

2 голосов
/ 14 октября 2019

Использование GroupBy с pd.Grouper, причина, по которой я использовал Grouper, заключается в том, что он сохраняет ваш date без изменений.

df.groupby(pd.Grouper(key='gps_updated_at', freq='H'))['mode'].value_counts()

Выход

gps_updated_at       mode   
2019-04-26 15:00:00  standby    3
                     good       1
2019-04-26 16:00:00  bad        1
                     good       1
Name: mode, dtype: int64

Если вы хотите вернуть кадр данных, используйте reset_index:

df.groupby(pd.Grouper(key='gps_updated_at', freq='H'))['mode'].value_counts().reset_index(name='count')

Выход

       gps_updated_at     mode  count
0 2019-04-26 15:00:00  standby      3
1 2019-04-26 15:00:00     good      1
2 2019-04-26 16:00:00      bad      1
3 2019-04-26 16:00:00     good      1
2 голосов
/ 14 октября 2019

Используйте DatetimeIndex.hour с SeriesGroupBy.value_counts:

s = df.groupby(df.index.hour)['mode'].value_counts()
print (s)
gps_updated_at  mode   
15              standby    3
                good       1
16              bad        1
                good       1
Name: mode, dtype: int64

print (s[15])
mode
standby    3
good       1
Name: mode, dtype: int64

print (s[16])
mode
bad     1
good    1
Name: mode, dtype: int64

df1 = df.groupby(df.index.hour)['mode'].value_counts().reset_index(name='count')
print (df1)
   gps_updated_at     mode  count
0              15  standby      3
1              15     good      1
2              16      bad      1
3              16     good      1

Или конвертируйте минуты и секунды в 0 с помощью DatetimeIndex.floor с DatetimeIndex.strftime:

s = df.groupby(df.index.floor('H').strftime('%H:%M:%S'))['mode'].value_counts()
print (s)
          mode   
15:00:00  standby    3
          good       1
16:00:00  bad        1
          good       1
Name: mode, dtype: int64

print (s['15:00:00'])
mode
standby    3
good       1
Name: mode, dtype: int64

print (s['16:00:00'])
mode
bad     1
good    1
Name: mode, dtype: int64

df2 = df.groupby(df.index.floor('H').strftime('%H:%M:%S').rename('hour'))['mode'].value_counts().reset_index(name='count')
print (df2)
       hour     mode  count
0  15:00:00  standby      3
1  15:00:00     good      1
2  16:00:00      bad      1
3  16:00:00     good      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...