Python: перекрытие диапазонов дат во временных рядах. - PullRequest
0 голосов
/ 06 мая 2020

Мой набор данных намного больше, поэтому я упростил его.

Я хочу преобразовать фрейм данных во временной ряд.

Бит, на котором я застрял:

У меня перекрывающиеся диапазоны дат, где у меня меньший диапазон дат внутри большего, как показано строкой 0 и строкой 1, где строка 1 и строка 2 находятся внутри диапазона дат строки 0.

df:
        date1      date2      reduction
0  2016-01-01 - 2016-01-05       7.0
1  2016-01-02 - 2016-01-03       5.0
2  2016-01-03 - 2016-01-04       6.0
3  2016-01-05 - 2016-01-12       10.0

Как я хочу, чтобы вывод выглядел:

        date1      date2     reduction
0  2016-01-01 2016-01-02        7.0
1  2016-01-02 2016-01-03        5.0
2  2016-01-03 2016-01-04        6.0
3  2016-01-04 2016-01-05        7.0
4  2016-01-05 2016-01-06        10.0
5  2016-01-06 2016-01-07        10.0
6  2016-01-07 2016-01-08        10.0
7  2016-01-08 2016-01-09        10.0
8  2016-01-09 2016-01-10        10.0
9  2016-01-10 2016-01-11        10.0
10 2016-01-11 2016-01-12        10.0

1 Ответ

1 голос
/ 06 мая 2020

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

 import pandas as pd
 import numpy as np
 import io

data='''
 date1 date2 reduction
0 2016-01-01 2016-01-05 7.0
1 2016-01-02 2016-01-03 5.0
2 2016-01-03 2016-01-04 6.0
3 2016-01-05 2016-01-12 10.0
'''

df = pd.read_csv(io.StringIO(data), sep=' ', index_col=0)

date_1 = pd.date_range(df.date1.min(), df.date2.max())
date_2 = pd.date_range(df.date1.min(), df.date2.max())

df2 = pd.DataFrame({'date1':date_1, 'date2':date_2, 'reduction':[0]*len(date_1)})
df2['date2'] = df2.date2.shift(-1)
df2.dropna(inplace=True)

for i in range(len(df)):
    df2['reduction'][(df2.date1 >= df.date1.iloc[i]) & (df2.date2 <= df.date2.iloc[i])] = df.reduction.iloc[i]

df2
    date1   date2   reduction
0   2016-01-01  2016-01-02  7
1   2016-01-02  2016-01-03  5
2   2016-01-03  2016-01-04  6
3   2016-01-04  2016-01-05  7
4   2016-01-05  2016-01-06  10
5   2016-01-06  2016-01-07  10
6   2016-01-07  2016-01-08  10
7   2016-01-08  2016-01-09  10
8   2016-01-09  2016-01-10  10
9   2016-01-10  2016-01-11  10
10  2016-01-11  2016-01-12  10
...