假设我们有这个数据框:
date value
2018-01-10 9:30:00 0
2018-02-11 10:00:00 1
我想将每行扩展到该时间前后 2 小时的范围内,并每 30 分钟重新采样一次,并且应该为新生成的行复制该值。
这是我想要的结果:
date value
2018-01-10 7:30:00 0
2018-01-10 8:00:00 0
2018-01-10 8:30:00 0
2018-01-10 9:00:00 0
2018-01-10 9:30:00 0
2018-01-10 10:00:00 0
2018-01-10 10:30:00 0
2018-01-10 11:00:00 0
2018-01-10 11:30:00 0
2018-02-11 8:00:00 1
2018-02-11 8:30:00 1
2018-02-11 9:00:00 1
2018-02-11 9:30:00 1
2018-02-11 10:00:00 1
2018-02-11 10:30:00 1
2018-02-11 11:00:00 1
2018-02-11 11:30:00 1
2018-02-11 12:00:00 1
非常有趣的问题,请参阅下面的代码(这是错误的),
(pd.concat([df, df.rename(lambda x:x+pd.DateOffset(hours=2)),
df.rename(lambda x:x+pd.DateOffset(hours=-2))])
.sort_index()
.resample('30min')
.ffill())
新答案(假设数据是 pandas 系列),
def func(s):
df = (pd.concat([s, s.rename(lambda x:x+pd.DateOffset(hours=2)),
s.rename(lambda x:x+pd.DateOffset(hours=-2))])
.sort_index()
.resample('30min')
.ffill())
return df
pd.concat(func(data.iloc[[i]]) for i in range(data.shape[0]))
col1=df1.date.map(lambda x:pd.date_range(start=pd.to_datetime(x)+pd.Timedelta(hours=-2)
,end=pd.to_datetime(x)+pd.Timedelta(hours=2),freq='30min').tolist())
df1.assign(date=col1).explode("date")
date value
2018-01-10 7:30:00 0
2018-01-10 8:00:00 0
2018-01-10 8:30:00 0
2018-01-10 9:00:00 0
2018-01-10 9:30:00 0
2018-01-10 10:00:00 0
2018-01-10 10:30:00 0
2018-01-10 11:00:00 0
2018-01-10 11:30:00 0
2018-02-11 8:00:00 1
2018-02-11 8:30:00 1
2018-02-11 9:00:00 1
2018-02-11 9:30:00 1
2018-02-11 10:00:00 1
2018-02-11 10:30:00 1
2018-02-11 11:00:00 1
2018-02-11 11:30:00 1
2018-02-11 12:00:00 1