Используйте 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