【问题标题】:Add missing timestamp row to a dataframe将缺少的时间戳行添加到数据框中
【发布时间】:2021-01-07 07:06:58
【问题描述】:

我有一个数据框,其中包含每天以两小时为间隔测量的数据,但是缺少一些时间间隔。我的数据集如下所示:

2020-12-01 08:00:00 145.9
2020-12-01 10:00:00 100.0
2020-12-01 16:00:00 99.3
2020-12-01 18:00:00 91.0

我正在尝试插入缺失的时间间隔并用 Nan 填充它们的值。

2020-12-01 08:00:00 145.9
2020-12-01 10:00:00 100.0
2020-12-01 12:00:00 Nan
2020-12-01 14:00:00 Nan
2020-12-01 16:00:00 99.3
2020-12-01 18:00:00 91.0

对于如何在 python 中实现这一点,我将不胜感激,因为我是一个从 python 开始的新手

【问题讨论】:

    标签: python pandas timestamp nan hour


    【解决方案1】:

    创建DatetimeIndex 并使用DataFrame.asfreq

    print (df)
    
                      date    val
    0  2020-12-01 08:00:00  145.9
    1  2020-12-01 10:00:00  100.0
    2  2020-12-01 16:00:00   99.3
    3  2020-12-01 18:00:00   91.0
    
    df['date'] = pd.to_datetime(df['date'])
    
    df = df.set_index('date').asfreq('2H')
    
    print (df)
                           val
    date                      
    2020-12-01 08:00:00  145.9
    2020-12-01 10:00:00  100.0
    2020-12-01 12:00:00    NaN
    2020-12-01 14:00:00    NaN
    2020-12-01 16:00:00   99.3
    2020-12-01 18:00:00   91.0
    

    【讨论】:

      【解决方案2】:

      假设你的 df 看起来像

                    datetime  value
      0  2020-12-01T08:00:00  145.9
      1  2020-12-01T10:00:00  100.0
      2  2020-12-01T16:00:00   99.3
      3  2020-12-01T18:00:00   91.0
      

      确保 datetime 列是 dtype datetime;

      df['datetime'] = pd.to_datetime(df['datetime'])
      

      以便您现在可以重新采样到 2 小时一次的频率:

      df.resample('2H', on='datetime').mean()
      
                           value
      datetime                  
      2020-12-01 08:00:00  145.9
      2020-12-01 10:00:00  100.0
      2020-12-01 12:00:00    NaN
      2020-12-01 14:00:00    NaN
      2020-12-01 16:00:00   99.3
      2020-12-01 18:00:00   91.0
      

      请注意,如果您的 df 已有日期时间索引,则无需设置 on= 关键字。重采样产生的 df 将有一个日期时间索引。

      还请注意,我使用 .mean() 作为 aggfunc,这意味着如果您在两个小时的间隔内有多个值,您将得到它的平均值。

      【讨论】:

      • 感谢 MrFuppes 的帮助,效果很好
      • @Amaka:如果其中一个答案解决了您的问题,请考虑 accepting it as answer
      【解决方案3】:

      您可以尝试以下方法:

      我为此使用了 datetime 和 timedelta,

      from datetime import datetime, timedelta
      
      # Asuming that the data is given like below.
      data = ['2020-12-01 08:00:00 145.9',
      '2020-12-01 10:00:00 100.0',
      '2020-12-01 16:00:00 99.3',
      '2020-12-01 18:00:00 91.0']
      
      # initialize the start time using data[0]
      date = data[0].split()[0].split('-')
      time = data[0].split()[1].split(':')
      start = datetime(int(date[0]), int(date[1]), int(date[2]), int(time[0]), int(time[1]), int(time[2]))
      
      newdata = []
      newdata.append(data[0])
      
      i = 1
      while i < len(data):
          cur = start
          nxt = start + timedelta(hours=2)
          
          if (str(nxt) != (data[i].split()[0] + ' ' + data[i].split()[1])):
              newdata.append(str(nxt) + ' NaN')
          else:
              newdata.append(data[i])
              i+=1
              
          start = nxt
          
      newdata
      

      注意: temedelta(hours=2) 会将现有时间增加 2 小时。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-01
        • 2018-12-06
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        相关资源
        最近更新 更多