Pandas Datetime многоиндексный - PullRequest
0 голосов
/ 13 июня 2018

Для следующего фрейма данных каждая учетная запись может иметь разную ставку каждый месяц.Я пытался найти курс, который будет использоваться для конкретной транзакции.

Например, если я ищу Rate_A для первого счета в 2018-01-20, я должен получить значение -1.206412.

Как лучше всего найти это значение?Я попытался использовать resample ('D'). Ffill (), но вместо этого получил ошибку, так как она не работает для мультииндекса.

Спасибо

                    Rate_A    Rate_B    Rate_C
date     account                              
2018-01   one    -1.206412  0.132003  1.024180
          two     2.565646 -0.827317  0.569605
2018-02   one     1.431256 -0.076467  0.875906
          two     1.340309 -1.187678 -2.211372

1 Ответ

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

Используйте DataFrameGroupBy.resample, но он работает только с DatetimeIndex, поэтому сначала преобразуйте второй уровень в столбец, а затем создайте DatetimeIndex:

df = df.reset_index(level=1)
df.index = pd.to_datetime(df.index)

df = df.groupby('account').resample('D').ffill()
print (df.head())
                   account    Rate_A    Rate_B   Rate_C
account date                                           
one     2018-01-01     one -1.206412  0.132003  1.02418
        2018-01-02     one -1.206412  0.132003  1.02418
        2018-01-03     one -1.206412  0.132003  1.02418
        2018-01-04     one -1.206412  0.132003  1.02418
        2018-01-05     one -1.206412  0.132003  1.02418

a = df.loc[('one', '2018-01-20'), 'Rate_A']
print (a)
#account  date      
#one      2018-01-20   -1.206412
#Name: Rate_A, dtype: float64

Другое решение безresample использовать частичное индексирование строк :

a = df.index.get_level_values('date')
b = df.index.get_level_values('account')

df.index = pd.MultiIndex.from_arrays([pd.to_datetime(a), b])
print (df)
                      Rate_A    Rate_B    Rate_C
date       account                              
2018-01-01 one     -1.206412  0.132003  1.024180
           two      2.565646 -0.827317  0.569605
2018-02-01 one      1.431256 -0.076467  0.875906
           two      1.340309 -1.187678 -2.211372


d = '2018-01-20'
a = df.loc[(d.rsplit('-', 1)[0], 'one'), 'Rate_A']
print (a)
date        account
2018-01-01  one       -1.206412
Name: Rate_A, dtype: float64

print (d.rsplit('-', 1)[0])
2018-01

А если дата - дата-время:

d = pd.to_datetime('2018-01-20')
print (d)
2018-01-20 00:00:00

a = df.loc[(d.strftime('%Y-%m'), 'one'), 'Rate_A']
print (a)
date        account
2018-01-01  one       -1.206412
Name: Rate_A, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...