Мне нужна помощь от экспертов pandas :) Мне нужно эффективно создавать DataFrame из словаря, который содержит список из двух значений DatetimeIndexes в качестве значений.
Вот краткий пример такого словаря:
import pandas as pd
d = {
871:[pd.date_range('20180131', '20180331', freq='M', normalize=True),
pd.date_range('20180228', '20180430', freq='M', normalize=True)],
872:[pd.date_range('20180228', '20180331', freq='M', normalize=True),
pd.date_range('20180331', '20180430', freq='M', normalize=True)]}
d
Out[3]:
{871: [DatetimeIndex(['2018-01-31', '2018-02-28', '2018-03-31'], dtype='datetime64[ns]', freq='M'),
DatetimeIndex(['2018-02-28', '2018-03-31', '2018-04-30'], dtype='datetime64[ns]', freq='M')],
872: [DatetimeIndex(['2018-02-28', '2018-03-31'], dtype='datetime64[ns]', freq='M'),
DatetimeIndex(['2018-03-31', '2018-04-30'], dtype='datetime64[ns]', freq='M')]}
То, что я хочу получить, - это DataFrame, где ключи dict используются как индексы и два столбца pd.Timestamp, которые соответствуют этим двум DatetimeIndexes сверху.
Вот как это должно выглядеть:
result_df
Out[6]:
Start End
871 2018-01-31 2018-02-28
871 2018-02-28 2018-03-31
871 2018-03-31 2018-04-30
872 2018-02-28 2018-03-31
872 2018-03-31 2018-04-30
PS Реальная задача состоит в том, чтобы разделить большой DataFrame на диапазоны дат, например ниже, на отдельные месяцы.
df_original
Out[19]:
Start End
Index
871 2018-01-31 2018-02-28
872 2018-02-28 2018-04-30
Большой - несколько сотен тысяч строк.
Использование:
d1 = {k: pd.DataFrame(list(zip(*v)), columns=['Start','End']) for k, v in d.items()}
df = pd.concat(d1).reset_index(level=1, drop=True)
print (df)
Start End
871 2018-01-31 2018-02-28
871 2018-02-28 2018-03-31
871 2018-03-31 2018-04-30
872 2018-02-28 2018-03-31
872 2018-03-31 2018-04-30