熊猫-填充时间序列数据中的缺失时间

时间:2019-11-24 13:59:10

标签: python pandas date time-series

具有这样的熊猫数据框:

    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。有什么想法吗?

1 个答案:

答案 0 :(得分: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