【问题标题】:Pandas upsample rows with a start and end timePandas 对具有开始和结束时间的行进行重新采样
【发布时间】:2022-01-07 11:07:17
【问题描述】:

我有一个表单的数据框:

In [5]: df = pd.DataFrame({
   ...:     'start_time': ['2022-01-01 01:15', '2022-01-01 13:00'],
   ...:     'end_time': ['2022-01-01 03:45', '2022-01-01 15:00'],
   ...:     'values': [1000, 750]})

In [6]: df
Out[6]: 
         start_time          end_time  values
0  2022-01-01 01:15  2022-01-01 03:45    1000
1  2022-01-01 13:00  2022-01-01 15:00     750

我想将其转换为 24 小时制的值,并在 start_time/end_time 范围内按比例拆分这些值。对于上面的例子,这应该产生:

In [10]: result
Out[10]: 
                     value
2022-01-01 00:00:00      0
2022-01-01 01:00:00    300
2022-01-01 02:00:00    400
2022-01-01 03:00:00    300
2022-01-01 04:00:00      0
2022-01-01 05:00:00      0
2022-01-01 06:00:00      0
2022-01-01 07:00:00      0
2022-01-01 08:00:00      0
2022-01-01 09:00:00      0
2022-01-01 10:00:00      0
2022-01-01 11:00:00      0
2022-01-01 12:00:00      0
2022-01-01 13:00:00    375
2022-01-01 14:00:00    375
2022-01-01 15:00:00      0
2022-01-01 16:00:00      0
2022-01-01 17:00:00      0
2022-01-01 18:00:00      0
2022-01-01 19:00:00      0
2022-01-01 20:00:00      0
2022-01-01 21:00:00      0
2022-01-01 22:00:00      0
2022-01-01 23:00:00      0

start_time/end_time 范围不重叠。关于如何完成此任务的任何建议?

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    用途:

    #get differencies between start and end in minutes
    df['diff'] = pd.to_datetime(df['end_time']).sub(pd.to_datetime(df['start_time'])).dt.total_seconds().div(60)
    
    #create DataFrame with repeat values by minutes
    s = pd.concat([pd.Series(r.Index,pd.date_range(r.start_time, r.end_time, freq='Min', closed='left')) for r in df.itertuples()])
    s = pd.Series(s.index, s.to_numpy(), name='new')
    df = df.join(s)
    
    #resample to hours
    df = df.resample('H', on='new').agg({'values':'first', 'diff':'first', 'new':'size'})
    #multiple values by ratio
    df['value'] = df['values'].mul(df['new'].div(df['diff'])).fillna(0)
    
    #add missing rows
    r = pd.date_range(df.index.min().normalize(), df.index.max().normalize() + pd.Timedelta('23H'), freq='H')
    df = df[['value']].reindex(r, fill_value=0)
    

    print (df)
                         value
    2022-01-01 00:00:00    0.0
    2022-01-01 01:00:00  300.0
    2022-01-01 02:00:00  400.0
    2022-01-01 03:00:00  300.0
    2022-01-01 04:00:00    0.0
    2022-01-01 05:00:00    0.0
    2022-01-01 06:00:00    0.0
    2022-01-01 07:00:00    0.0
    2022-01-01 08:00:00    0.0
    2022-01-01 09:00:00    0.0
    2022-01-01 10:00:00    0.0
    2022-01-01 11:00:00    0.0
    2022-01-01 12:00:00    0.0
    2022-01-01 13:00:00  375.0
    2022-01-01 14:00:00  375.0
    2022-01-01 15:00:00    0.0
    2022-01-01 16:00:00    0.0
    2022-01-01 17:00:00    0.0
    2022-01-01 18:00:00    0.0
    2022-01-01 19:00:00    0.0
    2022-01-01 20:00:00    0.0
    2022-01-01 21:00:00    0.0
    2022-01-01 22:00:00    0.0
    2022-01-01 23:00:00    0.0
    

    【讨论】:

    • 谢谢,这很酷。我自己也在考虑这样的事情,但使用秒而不是分钟。我担心的是,由于数据集非常大,几秒钟后我可能会遇到问题。
    猜你喜欢
    • 2023-02-24
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多