【问题标题】:How to upsample without filling the gaps in the datetime如何在不填补日期时间空白的情况下进行上采样
【发布时间】:2017-03-09 15:58:39
【问题描述】:

给定以下 1 小时的数据帧:

                  column1
datetime                 
2016-08-09 19:00:00     1
2016-08-09 20:00:00     2
2016-08-10 06:00:00     3
2016-08-10 07:00:00     4

当我尝试使用此方法将数据上采样到 10 分钟时间范围时:

data10min = data1hour.column1.resample("10Min").pad() 

我得到以下结果。

                  column1
datetime                 
2016-08-09 19:00:00     1
2016-08-09 19:10:00     1
2016-08-09 19:20:00     1
2016-08-09 19:30:00     1
2016-08-09 19:40:00     1
2016-08-09 19:50:00     1
2016-08-09 20:00:00     2
2016-08-09 20:10:00     2
2016-08-09 20:20:00     2
2016-08-09 20:30:00     2
2016-08-09 20:40:00     2
2016-08-09 20:50:00     2
2016-08-09 21:00:00     2
....
2016-08-10 04:40:00     2
2016-08-10 04:50:00     2
2016-08-10 05:00:00     2
2016-08-10 05:10:00     2
2016-08-10 05:20:00     2
2016-08-10 05:30:00     2
2016-08-10 05:40:00     2
2016-08-10 05:50:00     2
2016-08-10 06:00:00     3
2016-08-10 06:10:00     3
2016-08-10 06:20:00     3
2016-08-10 06:30:00     3
2016-08-10 06:40:00     3
2016-08-10 06:50:00     3
2016-08-10 07:00:00     4

问题在于它填补了 2016-08-09 20:00:00 和 2016-08-10 06:00:00 之间的日期时间间隔。

我正在寻找以下结果,但找不到实现此目标的有效方法。必须有一种简单的上采样方法,而不会填补日期时间的空白。

                  column1
datetime                 
2016-08-09 19:00:00     1
2016-08-09 19:10:00     1
2016-08-09 19:20:00     1
2016-08-09 19:30:00     1
2016-08-09 19:40:00     1
2016-08-09 19:50:00     1
2016-08-09 20:00:00     2
2016-08-09 20:10:00     2
2016-08-09 20:20:00     2
2016-08-09 20:30:00     2
2016-08-09 20:40:00     2
2016-08-09 20:50:00     2
2016-08-10 06:00:00     3
2016-08-10 06:10:00     3
2016-08-10 06:20:00     3
2016-08-10 06:30:00     3
2016-08-10 06:40:00     3
2016-08-10 06:50:00     3
2016-08-10 07:00:00     4

上采样应该在任何有差距的时间范围内起作用。例如从有间隙的 1D 到有间隙的 1H 或从有间隙的 5min 到有间隙的 1min 等。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您需要对什么是差距有一个很好的定义。假设在您的示例中间隔是恒定的 1 小时,那么任何更长的时间都将是一个间隙。

    鉴于上述假设,首先重新索引到每小时间隔,然后重新采样到 10 分钟就可以了。

    idx = pd.DatetimeIndex(start=df.index[0], end=df.index[-1], freq='1H')
    df.reindex(idx).resample('10min').pad().dropna() 
    
                         column1
    2016-08-09 19:00:00      1.0
    2016-08-09 19:10:00      1.0
    2016-08-09 19:20:00      1.0
    2016-08-09 19:30:00      1.0
    2016-08-09 19:40:00      1.0
    2016-08-09 19:50:00      1.0
    2016-08-09 20:00:00      2.0
    2016-08-09 20:10:00      2.0
    2016-08-09 20:20:00      2.0
    2016-08-09 20:30:00      2.0
    2016-08-09 20:40:00      2.0
    2016-08-09 20:50:00      2.0
    2016-08-10 06:00:00      3.0
    2016-08-10 06:10:00      3.0
    2016-08-10 06:20:00      3.0
    2016-08-10 06:30:00      3.0
    2016-08-10 06:40:00      3.0
    2016-08-10 06:50:00      3.0
    2016-08-10 07:00:00      4.0
    

    在上面的示例中,我假设您的原始 Dataframe 已排序,因此获取第一个和最后一个元素将覆盖整个范围。您还可以取最小值、最大值或一些自定义的开始和结束日期。

    不知何故,重新索引将数据类型更改为浮动,这有点奇怪。

    【讨论】:

    • 谢谢@RutgerKassies 的回答:)
    猜你喜欢
    • 1970-01-01
    • 2019-08-14
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多