堆叠每日数据数据框以获得每小时输出
Stacking daily data dataframe to get hourly output
我有一个看起来像这样的数据框:
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 小时的连续性。我不确定如何用 python 方式进行这种堆叠。
在创建日期时间列表后使用
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')
我有一个看起来像这样的数据框:
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 小时的连续性。我不确定如何用 python 方式进行这种堆叠。
在创建日期时间列表后使用
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')