如何使用pandas填充一些缺失日期的时间序列数据

5

我有一个数据集,其中包含像这样的缺失日期。

date,value
2015-01-01,7392
2015-01-03,4928
2015-01-06,8672

This is what I expect to achieve.

date,value
2015-01-01,7392
2015-01-02,7392 # ffill 1st
2015-01-03,4928
2015-01-04,4928 # ffill 3rd
2015-01-05,4928 # ffill 3rd
2015-01-06,8672

我尝试了很多方法,阅读了文档,但是仍然无法找到解决方案。我猜测可以使用df.resample('d',fill_method='ffill'),但我还没有达到目标。有人可以帮我解决这个问题吗?

这是我所做的。

>>> import pandas as pd
>>> df = pd.read_csv(text,sep="\t",index_col='date')
>>> df.index = df.index.to_datetime()
>>> index = pd.date_range(df.index[1],df.index.max())

在这里,我从2015年1月1日到2015年1月6日期间获得了DatetimeIndex。

>>> values = [ x for x in range(len(index)) ]
>>> df2 = pd.DataFrame(values,index=index)

接下来,我将合并原始数据和DatetimeIndex。

>>> df + df2

             0   value
2015-01-01 NaN NaN
2015-01-02 NaN NaN
2015-01-03 NaN NaN
2015-01-04 NaN NaN
2015-01-05 NaN NaN
2015-01-06 NaN NaN

NaN? I am puzzled.

>>> df3 = df + df2
>>> df3.info()

DatetimeIndex: 10 entries, 2015-01-01 to 2015-01-10
Data columns (total 2 columns):
value    0 non-null float64
dtypes: float64(1)

原始值是int类型,但被转换成了float类型。

我的错误在哪里?


1
当您尝试使用df.resample('d',fill_method ='ffill')时出现了什么问题? - ayhan
我想把这个作为我的回答编辑添加进去,但你比我先完成了。如果你的建议没有问题,那么我会删除我的回答。 - IanS
我猜OP已经尝试过了,但是出了些问题。我猜问题与时间格式有关(2015-01-02被解释为2月1日而不是1月2日)。顺便说一下,这是OP自己的解决方案,不是我的。 :) - ayhan
1个回答

1

试试这个:

import numpy as np
df2 = pd.DataFrame(np.nan, index=index)
df.combine_first(df2).fillna(method='ffill')

combine_first函数会将df2中的nan值替换为原始df中存在的值。然后,您可以使用fillna函数填充剩余的nan值。


非常感谢!你的评论起了作用,我实现了它! - Akio Omi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接