【问题标题】:Pandas - fill missing times in Time-Series dataPandas - 填补时间序列数据中的缺失时间
【发布时间】:2020-03-19 22:52:40
【问题描述】:

有一个这样的熊猫数据框:

    date_time    var1     var2    var3   var4    var6
20080322 0000       0        0       0      0     -11
20080322 0001       0        5       0      0       9
20080322 0003       5        0       0      0       0
20080322 0004       0        0      11      0      -9
20080322 0005       0       12       0      0       1
20080322 0009       7        0       0      4       5
20080322 0010       0        0       0      0      27

数据丢失了几分钟(0002、0006、0007、0008)。我正在寻找一种将丢失的行插入数据框中的好方法。到目前为止我尝试过的:

import pandas as pd
widths = [13,8,9,8,7,8]
df = pd.read_fwf("data", widths=widths)

df['date_time'] = pd.to_datetime(df['date_time'] , format='%Y%m%d %H%M')
df = df.set_index('date_time').reindex(pd.date_range("20080322 0000", "20080322 0010", freq='1min').strftime('%Y%m%d %H%M'), fill_value="NaN")
print (df)

出现缺失的行,但所有值均为 NaN。有什么想法吗?

【问题讨论】:

  • 但是所有的值都是NaN你想要什么值?
  • @splash58 数据帧中的整数值(例如第一行中的 0,0,0,0,-11)

标签: python pandas date time-series


【解决方案1】:

一种可能的解决方案是删除转换为日期时间并按字符串重新索引(由DatetimeIndex.strftime 创建):

df = pd.read_fwf("data", widths=widths)

df = (df.set_index('date_time')
        .reindex(pd.date_range("20080322 0000", "20080322 0010", freq='1min')
        .strftime('%Y%m%d %H%M')))
print (df)
               var1  var2  var3  var4  var6
20080322 0000   0.0   0.0   0.0   0.0 -11.0
20080322 0001   0.0   5.0   0.0   0.0   9.0
20080322 0002   NaN   NaN   NaN   NaN   NaN
20080322 0003   5.0   0.0   0.0   0.0   0.0
20080322 0004   0.0   0.0  11.0   0.0  -9.0
20080322 0005   0.0  12.0   0.0   0.0   1.0
20080322 0006   NaN   NaN   NaN   NaN   NaN
20080322 0007   NaN   NaN   NaN   NaN   NaN
20080322 0008   NaN   NaN   NaN   NaN   NaN
20080322 0009   7.0   0.0   0.0   4.0   5.0
20080322 0010   0.0   0.0   0.0   0.0  27.0

另一个解决方案是删除 strftime 以将日期时间转换为字符串,以便按日期时间重新索引:

df = pd.read_fwf("data", widths=widths)

df['date_time'] = pd.to_datetime(df['date_time'] , format='%Y%m%d %H%M')
df = (df.set_index('date_time')
        .reindex(pd.date_range("20080322 0000", "20080322 0010", freq='1min')))

或者使用DataFrame.asfreq - 使用DatetimeIndex

df = pd.read_fwf("data", widths=widths)

df['date_time'] = pd.to_datetime(df['date_time'] , format='%Y%m%d %H%M')
df = df.set_index('date_time').asfreq('1 Min')

print (df)
                     var1  var2  var3  var4  var6
2008-03-22 00:00:00   0.0   0.0   0.0   0.0 -11.0
2008-03-22 00:01:00   0.0   5.0   0.0   0.0   9.0
2008-03-22 00:02:00   NaN   NaN   NaN   NaN   NaN
2008-03-22 00:03:00   5.0   0.0   0.0   0.0   0.0
2008-03-22 00:04:00   0.0   0.0  11.0   0.0  -9.0
2008-03-22 00:05:00   0.0  12.0   0.0   0.0   1.0
2008-03-22 00:06:00   NaN   NaN   NaN   NaN   NaN
2008-03-22 00:07:00   NaN   NaN   NaN   NaN   NaN
2008-03-22 00:08:00   NaN   NaN   NaN   NaN   NaN
2008-03-22 00:09:00   7.0   0.0   0.0   4.0   5.0
2008-03-22 00:10:00   0.0   0.0   0.0   0.0  27.0

如果需要,最后加上index的原始格式DatetimeIndex.strftime

df.index = df.index.strftime('%Y%m%d %H%M')
print (df)
               var1  var2  var3  var4  var6
20080322 0000   0.0   0.0   0.0   0.0 -11.0
20080322 0001   0.0   5.0   0.0   0.0   9.0
20080322 0002   NaN   NaN   NaN   NaN   NaN
20080322 0003   5.0   0.0   0.0   0.0   0.0
20080322 0004   0.0   0.0  11.0   0.0  -9.0
20080322 0005   0.0  12.0   0.0   0.0   1.0
20080322 0006   NaN   NaN   NaN   NaN   NaN
20080322 0007   NaN   NaN   NaN   NaN   NaN
20080322 0008   NaN   NaN   NaN   NaN   NaN
20080322 0009   7.0   0.0   0.0   4.0   5.0
20080322 0010   0.0   0.0   0.0   0.0  27.0

【讨论】:

  • 好的。是否可以保留原始数据类型(在这种情况下为 int?)现在它是浮点数。
  • @mcatis - 是的,如果使用pandas 0.24.+this 是可能的 - 使用df = df.astype('Int64')
  • 谢谢它的工作。你知道为什么我的标题“date_time”消失了吗?
  • @mcatis - 是的,因为date_range 中没有参数name - 所以为了避免它使用.reindex(pd.date_range("20080322 0000", "20080322 0010", freq='1min', name='date_time')))
  • 它不起作用。虽然我添加了名称参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 2021-03-23
  • 2019-04-22
  • 2017-05-06
相关资源
最近更新 更多