Как объединить DataFrame с Multi-Index - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу создать мультииндекс на основе дат и времени из моего DataFrame - df. Это на самом деле работает, и indexed возвращает правильный мультииндекс (непрерывные даты с 10.02.2017 до 31.03.2017 с непрерывным временем)с 08:00:00 до 21:55:00 за 5 минут).

Проблема в том, что у моего набора данных нет полных наблюдений.Значит, на случайный день могут отсутствовать наблюдения за 08:05:00 до 08:40:00.Мой мультииндекс имеет длину 20496, а мой DataFrame - 20486.

Когда я хочу объединить индекс с моими DataFrame, все наблюдения равны NAN.Кто-нибудь сейчас как слить мультииндекс с моим начальным DataFrame - df?

df = pd.read_csv(file_name, parse_dates=[0], 
index_col=0, sep=',')
df['Date'] = df.index.date
df['Time'] = df.index.time
df['Time'] = df['Time'].astype(str)
df = df[df['Time'] != '22:00:00']

list_date = set(df['Date'])
list_time = set(df['Time'])

list_date = sorted(list_date)
list_time = sorted(list_time)

iterables = [list_date, list_time]
indexed = pd.MultiIndex.from_product(iterables, 
names=['date', 'time'])
df_new = pd.DataFrame(df, index=indexed)

df вывод:

                            r2     var_v2x        Date      Time
TIME1                                                            
2017-10-02 08:00:00         NaN  0.00008784  2017-10-02  08:00:00
2017-10-02 08:05:00  0.00000000  0.00008784  2017-10-02  08:05:00
2017-10-02 08:10:00  0.00000008  0.00008784  2017-10-02  08:10:00

1 Ответ

0 голосов
/ 21 сентября 2018

Нашел решение (возможно, не изящное).

df = pd.read_csv(file_name, parse_dates=[0], index_col=0, sep=',')
df['Date'] = df.index.date
df['Time'] = df.index.time
df['Time'] = df['Time'].astype(str)

df = df[df['Time'] != '22:00:00']

list_date = set(df['Date'])
list_time = set(df['Time'])

list_date = sorted(list_date)
list_time = sorted(list_time)

iterables = [list_date, list_time]
indexed = pd.MultiIndex.from_product(iterables, names=['date', 'time'])

df_index_date = indexed.get_level_values(0)
df_index_time = indexed.get_level_values(1)

df_joined = pd.DataFrame(df_index_date.astype(str) + ' ' + df_index_time.astype(str))
df_joined = df_joined.reset_index()
df_joined = df_joined.set_index(df_joined[0])
del df_joined['index']
del df_joined[0]

df_final = df_joined.join(df)
df_final = df_final.reset_index(drop=True)
df_final = df_final.set_index(indexed)
...