【问题标题】:Check whether a certain datetime value is missing in a given period检查给定时间段内是否缺少某个日期时间值
【发布时间】:2019-12-25 08:25:25
【问题描述】:

我有一个带有 DateTime 索引的 df,如下所示:

DateTime
2017-01-02 15:00:00
2017-01-02 16:00:00
2017-01-02 18:00:00
....
....
2019-12-07 22:00:00
2019-12-07 23:00:00

现在,我想知道在 1 小时间隔内是否缺少任何时间。因此,例如,当我们从 16:0018:00 时,第 3 个读数缺少 1 个读数,那么有可能检测到这一点吗?

【问题讨论】:

    标签: python-3.x pandas datetime data-science


    【解决方案1】:

    使用最小和最大日期时间创建date_range,并通过Index.isinboolean indexing~ 过滤值以用于反转掩码:

    print (df)
                 DateTime
    0 2017-01-02 15:00:00
    1 2017-01-02 16:00:00
    2 2017-01-02 18:00:00
    
    
    r = pd.date_range(df['DateTime'].min(), df['DateTime'].max(), freq='H')
    print (r)
    DatetimeIndex(['2017-01-02 15:00:00', '2017-01-02 16:00:00',
                   '2017-01-02 17:00:00', '2017-01-02 18:00:00'],
                  dtype='datetime64[ns]', freq='H')
    
    out = r[~r.isin(df['DateTime'])]
    print (out)
    DatetimeIndex(['2017-01-02 17:00:00'], dtype='datetime64[ns]', freq='H')
    

    另一个想法是使用辅助列创建DatetimeIndex,通过Series.asfreq 更改频率并过滤缺失值的索引值:

    s = df[['DateTime']].assign(val=1).set_index('DateTime')['val'].asfreq('H')
    print (s)
    DateTime
    2017-01-02 15:00:00    1.0
    2017-01-02 16:00:00    1.0
    2017-01-02 17:00:00    NaN
    2017-01-02 18:00:00    1.0
    Freq: H, Name: val, dtype: float64
    
    out = s.index[s.isna()]
    print (out)
    DatetimeIndex(['2017-01-02 17:00:00'], dtype='datetime64[ns]', name='DateTime', freq='H')
    

    【讨论】:

    • 谢谢,它成功了。不得不更改为 df.index.min() 等等,因为 DateTime 是索引列。
    【解决方案2】:

    假设日期时间格式始终相同是否安全?如果是,您为什么不从各自的时间戳中提取“小时”值并将它们与您想要的间隔进行比较,例如:

    import re
    
    #store some datetime values for show
    datetimes=[
    "2017-01-02 15:00:00",
    "2017-01-02 16:00:00",
    "2017-01-02 18:00:00",
    "2019-12-07 22:00:00",
    "2019-12-07 23:00:00"
    ]
    
    #extract hour value via regex (first match always is the hours in this format)
    findHour = re.compile("\d{2}(?=\:)")
    prevx = findHour.findall(datetimes[1])[0]
    
    #simple comparison: compare to previous value, calculate difference, set previous value to current value
    for x in datetimes[2:]:
        cmp = findHour.findall(x)[0]
        diff = int(cmp) - int(prevx)
        if diff > 1:
            print("Missing Timestamp(s) between {} and {} hours!".format(prevx, cmp))
        prevx = cmp
    

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 2018-07-26
      • 2011-02-07
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      相关资源
      最近更新 更多