Как выбрать два набора года с индексом datetime и lo c? - PullRequest
1 голос
/ 29 января 2020

В настоящее время я имею дело с фреймом данных, состоящим из сотен тысяч строк и более, с индексом, составленным из значений даты и времени.

Вы можете создать микро-образец моего фрейма данных с помощью этого кода:

import pandas as pd
import numpy as np

dates = pd.date_range(start='1/1/2015', end='1/1/2020', freq='H')
df = pd.DataFrame(dates, columns=['Date'])
df['Value'] = np.random.randint(0,1000, len(dates))
df.set_index('Date', inplace=True)

Я бы хотел выбрать все «2015» и «2018» год, или «2015-01» и «2015-06». Я знаю, как разделить между двумя значениями с SliceIndex. Я знаю, как получить один целый год, но я не знаю, как получить два целых года с loc.

df['2015'] # it works
df[(slice('2015', '2016')] # or df['2015':'2016']

# but
df[['2015', '2016']] # it does not work.

На самом деле у меня есть мут-индекс. Чтобы построить пример:

df1 = df.copy()
df['lvl0'] = ['a']*len(df)
df1['lvl0'] = ['b']*len(df)
mlti_df = pd.concat([df, df1]).reset_index().set_index(['lvl0', 'Date'])

mlti_df[(slice(None), ['2015', '2016'])] # <= does not work

Можно ли таким способом получить строку? Я не нашел ответа, ища вчера в течение нескольких часов.

1 Ответ

1 голос
/ 29 января 2020

Первый partial string indexing работает только с одним годом, а не с перечнем лет.

Я думаю, вам нужно Index.isin с выпиской лет на DatetimeIndex.year и фильтрация по boolean indexing:

df1 = df[df.index.year.isin([2015, 2016])]
print (df1)
                     Value
Date                      
2015-01-01 00:00:00    858
2015-01-01 01:00:00    807
2015-01-01 02:00:00    895
2015-01-01 03:00:00    159
2015-01-01 04:00:00    176
                   ...
2016-12-31 19:00:00    888
2016-12-31 20:00:00    162
2016-12-31 21:00:00    207
2016-12-31 22:00:00    545
2016-12-31 23:00:00     49

[17544 rows x 1 columns]

А для MultiIndex решение является одинаковым, только добавьте MultiIndex.get_level_values:

df2 = mlti_df[mlti_df.index.get_level_values('Date').year.isin([2015, 2016])]
print (df2)
                          Value
lvl0 Date                      
a    2015-01-01 00:00:00    626
     2015-01-01 01:00:00    941
     2015-01-01 02:00:00    405
     2015-01-01 03:00:00    249
     2015-01-01 04:00:00    320
                        ...
b    2016-12-31 19:00:00    752
     2016-12-31 20:00:00    829
     2016-12-31 21:00:00    843
     2016-12-31 22:00:00    306
     2016-12-31 23:00:00     96

[35088 rows x 1 columns]
...