具有这样的熊猫数据框:
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。有什么想法吗?
答案 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