通过对每一行重新采样来扩展数据框,以便在 pandas 中的每个特定行之前和之后都有一个范围

问题描述 投票:0回答:2

假设我们有这个数据框:

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
python pandas dataframe
2个回答
2
投票

非常有趣的问题,请参阅下面的代码(这是错误的),

(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]))

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
© www.soinside.com 2019 - 2024. All rights reserved.