Pandas - Как добавить новые пустые строки с индексом из списка DateTimeIndex? - PullRequest
2 голосов
/ 08 марта 2020

Извините, я застрял.

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

Эти DateTimeIndex имеют для использования в качестве индексов для новых строк.

То есть со следующими данными:

import pandas as pd

df = pd.DataFrame({'Start': [pd.Timestamp('1970-01-02 00:00:00'),pd.Timestamp('1970-03-02 00:00:00')], 'End': [pd.Timestamp('1970-01-02 00:10:00'), pd.Timestamp('1970-03-02 00:10:00')], 'Freq': [pd.Timedelta(5,'m'),pd.Timedelta(5,'m')]})
df = df.apply(lambda x: pd.date_range(start = x.Start, end = x.End, freq = x.Freq), axis=1)

df2 = pd.DataFrame({'Timestamp':[pd.Timestamp('1970-01-03 00:00:00')], 'Data':[4]}).set_index('Timestamp')

Я получаю входные данные:

In [62]: df2.index
Out[62]: DatetimeIndex(['1970-01-03'], dtype='datetime64[ns]', name='Timestamp', freq=None)

In[63]: df.to_list()
Out[21]: 
[DatetimeIndex(['1970-01-02 00:00:00', '1970-01-02 00:05:00',
                '1970-01-02 00:10:00'],
               dtype='datetime64[ns]', freq='5T'),
 DatetimeIndex(['1970-03-02 00:00:00', '1970-03-02 00:05:00',
                '1970-03-02 00:10:00'],
               dtype='datetime64[ns]', freq='5T')]

Что я хотел бы получить является кадром данных, основанным на df2, с новыми строками, имеющими в качестве временных отметок те, которые идут из df.

df2_new
                    Data
Timestamp       
1970-01-03 00:00:00    4
1970-01-02 00:00:00
1970-01-02 00:05:00
1970-01-02 00:10:00
1970-03-02 00:00:00
1970-03-02 00:05:00
1970-03-02 00:10:00

Я пытался использовать следующую строку, но получаю ошибку:

df2.reindex(df2.index.to_list() + df.to_list())

TypeError: unhashable type: 'DatetimeIndex'

Пример, который я привожу, упрощен, так как у df есть одна строка, но может быть несколько.

Пожалуйста, у вас есть идеи, как я могу это сделать?

Заранее спасибо за вашу помощь! Всем хорошего вечера, Bests!

1 Ответ

1 голос
/ 08 марта 2020

IIU C, вы можете определить свой «временной диапазон» немного по-другому, но ключевым шагом является использование pd.Index.union:

import pandas as pd

df = pd.DataFrame({'Start':[pd.Timestamp('1970-01-02 00:00:00')], 
                   'End':[pd.Timestamp('1970-01-02 00:10:00')], 
                   'Freq':[pd.Timedelta(5,'m')]})
timerange = df.apply(lambda x: pd.Series(pd.date_range(start = x.Start, 
                                                       end = x.End, 
                                                       freq = x.Freq)), 
                     axis=1).stack()[0]

df2 = pd.DataFrame({'Timestamp':[pd.Timestamp('1970-01-03 00:00:00')], 
                    'Data':[4]}).set_index('Timestamp')

df2 = df2.reindex(df2.index.union(timerange))
df2

Выход:

                     Data
1970-01-02 00:00:00   NaN
1970-01-02 00:05:00   NaN
1970-01-02 00:10:00   NaN
1970-01-03 00:00:00   4.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...