Составление ежедневных данных для получения ежечасного вывода - PullRequest
1 голос
/ 18 апреля 2019

У меня есть датафрейм, который выглядит как:

df.ix[1:3]

          Val   endDay        startDay                             
1        2.20   1996-04-01    1996-03-31
2        5.15   1997-04-05    1997-04-01

Однако startDay начинается в час 9 am и продолжается до 8 am в день окончания.

Я ищу следующий вывод:

startDay     Hour   Val
1996-03-31   9     2.20 
1996-03-31   10    2.20 
                     ........
1996-03-31   24    2.20 
1996-04-01   1     2.20 
                     ........
1996-04-01   7     2.20 
1996-04-01   8     2.20
1997-04-01   9     5.15 
1997-04-01   10    5.15 
                     ........
1997-04-01   24    5.15 
1997-04-05   1     5.15 
                     ........
1997-04-05   7     5.15 
1997-04-05   8     5.15 

Я просто использовал ....., чтобы представить продолжение часов с 11 по 23 и 2, хотя и 6. Я не уверен, как сделать это суммированием.

1 Ответ

2 голосов
/ 18 апреля 2019

Просто делаем с unnesting после создания списка datetime

df['day']=[pd.date_range(x+' 09:00:00',y+' 08:00:00',freq='H') for x , y in zip(df.startDay,df.endDay)]
yourdf=unnesting(df,['day']).drop_duplicates('day')
yourdf
Out[909]: 
                  day   Val      endDay    startDay
1 1996-03-31 09:00:00  2.20  1996-04-01  1996-03-31
1 1996-03-31 10:00:00  2.20  1996-04-01  1996-03-31
1 1996-03-31 11:00:00  2.20  1996-04-01  1996-03-31
1 1996-03-31 12:00:00  2.20  1996-04-01  1996-03-31
...

Обратите внимание, что я не разделил два столбца с date и hour, что можно сделать с помощью yourdf.day.dt.hour; yourdf.dt.date


def unnesting(df, explode):
    idx = df.index.repeat(df[explode[0]].str.len())
    df1 = pd.concat([
        pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
    df1.index = idx

    return df1.join(df.drop(explode, 1), how='left')
...