数据上采样和插值

3

I have the following dataframe:

Month   Col_1    Col_2

1       0,121    0,123
2       0,231    0,356
3       0,150    0,156
4       0,264    0,426
...

我需要将此数据重新采样为每周一次,并在数据点之间进行插值。后者很简单,但重新索引部分有点棘手,至少对我来说是这样。如果使用DataFrame.reindex()方法,它只会删除数据帧中的所有条目。我试过手动创建新的“NaN”条目,以在每个连续月份之间使用.loc()方法,但这种方法会覆盖我已经拥有的条目。有什么办法吗?谢谢!

你的每周决心取决于这些是哪些月份。你只提供了整数。 - piRSquared
好的,这就是我获取数据的方式,它是按照日历顺序排列的。我应该先将其转换为日期时间索引吗?在这种情况下,重采样如何处理插值? - davidr
1个回答

1
我需要假设一个开始日期,我选择了2009-12-31
为了使resample正常工作,你需要一个pd.DateTimeIndex
start_date = pd.to_datetime('2009-12-31')
df.Month = df.Month.apply(lambda x: start_date + pd.offsets.MonthEnd(x))
df = df.set_index('Month')

df.resample('W').interpolate()

enter image description here


可复制的代码
from StringIO import StringIO
import pandas as pd

text = """Month   Col_1    Col_2
1       0,121    0,123
2       0,231    0,356
3       0,150    0,156
4       0,264    0,426"""

df = pd.read_csv(StringIO(text), decimal=',', delim_whitespace=True)

start_date = pd.to_datetime('2009-12-31')
df.Month = df.Month.apply(lambda x: start_date + pd.offsets.MonthEnd(x))
df = df.set_index('Month')

df.resample('W').interpolate()

太好了!它完全符合我的需求,尽管数据框架的较差部分对此有所反感。无论如何,我无法运行它,出现“AttributeError:'DataFrame'对象没有'month'属性”的错误。我尝试使用df ['Month']而不是df.Month,但仍然出现错误。有任何想法吗? - davidr
@davidr 如果这是直接复制/粘贴的,我注意到月份是小写的。 - piRSquared
不,不是小写,是大写的。我使用的代码直接复制粘贴了你在这里写的内容。无论如何,我尝试在该方法之前创建一个新列,一个空列。这是我得到的结果:“ValueError: invalid literal for int() with base 10: ''”。 - davidr
啊,我想是逗号的问题。我会添加和我复制你的数据时使用的完全相同的代码以及我如何发送它的方式。顺便说一句,这正是为什么发布生成数据的代码是个好主意的案例。稍等片刻。 - piRSquared
代码的最新版本已经可以运行,谢谢。不过,我仍然从一个.csv文件中读取数据,其中小数点是点而不是逗号。我将尝试从另一台计算机上运行它,也许Anacondas在这台电脑上的设置会导致某些问题。再次感谢您的耐心和指导。 - davidr
1
@davidr 如果这个回答解决了你的问题,请不要忘记将其标记为答案。 - piRSquared

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