pandas.Series.interpolate() 没有任何效果。为什么?

15 投票
5 回答
12498 浏览
提问于 2025-04-18 04:13

我有一个数据框,它的索引是日期时间格式。这里面有一列:

>>> y.out_brd
2013-01-01 11:25:00     0.04464286
2013-01-01 11:30:00            NaN
2013-01-01 11:35:00            NaN
2013-01-01 11:40:00    0.005952381
2013-01-01 11:45:00     0.01785714
2013-01-01 11:50:00    0.008928571
Freq: 5T, Name: out_brd, dtype: object

当我尝试在这个函数上使用 interpolate() 时,发现完全没有任何变化:

>>> y.out_brd.interpolate(method='time')
2013-01-01 11:25:00     0.04464286
2013-01-01 11:30:00            NaN
2013-01-01 11:35:00            NaN
2013-01-01 11:40:00    0.005952381
2013-01-01 11:45:00     0.01785714
2013-01-01 11:50:00    0.008928571
Freq: 5T, Name: out_brd, dtype: object

我该怎么做才能让它有效呢?

更新:这是生成这个数据框的代码。

time_index = pd.date_range(start=datetime(2013, 1, 1, 3),
                       end=datetime(2013, 1, 2, 2, 59),
                       freq='5T')
grid_columns = [u'in_brd', u'in_alt', u'out_brd', u'out_alt']                           

df = pd.DataFrame(index=time_index, columns=grid_columns)

之后我在单元格里填了一些数据。

我有一个数据框 field_data,里面是关于铁路上下车的调查数据,还有一个 station 变量。

我还定义了一个 interval_end 函数,代码如下:

interval_end = lambda index, prec_lvl: index.to_datetime() \
                        + timedelta(minutes=prec_lvl - 1,
                                    seconds=59)

代码:

for index, row in df.iterrows():
    recs = field_data[(field_data.station_name == station)
                    & (field_data.arrive_time >= index.time())
                    & (field_data.arrive_time <= interval_end(
                                        index, prec_lvl).time())]
    in_recs_num = recs[recs.orientation == u'in'][u'train_number'].count()
    out_recs_num = recs[recs.orientation == u'out'][u'train_number'].count()

    if in_recs_num:
        df.loc[index, u'in_brd'] = recs[
                recs.orientation == u'in'][u'boarding'].sum()    / \
                (in_recs_num * CAR_CAPACITY)
        df.loc[index, u'in_alt'] = recs[
                recs.orientation == u'in'][u'alighting'].sum()   / \
                (in_recs_num * CAR_CAPACITY)
    if out_recs_num:
        df.loc[index, u'out_brd'] = recs[
                recs.orientation == u'out'][u'boarding'].sum()  / \
                (out_recs_num * CAR_CAPACITY)
        df.loc[index, u'out_alt'] = recs[
                recs.orientation == u'out'][u'alighting'].sum() / \
                (out_recs_num * CAR_CAPACITY)

5 个回答

0

遇到了一个类似的问题,发现 interpolate 没有任何作用。

问题在于,应该被插值的值是 0,而不是 np.nan。你需要确保有 np.nan 的值需要进行插值处理。比如:

test_pdf["col"] = test_pdf.col.replace(0, np.nan)

test_pdf["interpolated_col"] = test_pdf.col.interpolate(method='linear', direction="forward")

print(test_pdf)
0

这是Phillip的简短回答,我第一次没看到,后来回来补充的:

你需要有一个浮点数序列:

s.astype(float).interpolate(method='time')
0

你也可以不改变数据框的名字,通过“就地”修改来解决这个问题:

y.out_brd.interpolate(method='time', inplace=True)
2

我来晚了,不过这个解决了我的问题。你需要把结果赋值给一个变量,或者直接赋值给它自己。

y=y.out_brd.interpolate(method='time')
16

你需要把你的 Series 转换成 float64 类型,而不是现在的 object 类型。下面有个例子来说明这两者的区别。一般来说,object 类型的 Series 用处不大,最常见的情况是 Series 里面包含字符串。除此之外,object 类型的处理速度很慢,因为它不能利用任何数据类型的信息。

In [9]: s = Series(randn(6), index=pd.date_range('2013-01-01 11:25:00', freq='5T', periods=6), dtype=object)

In [10]: s.iloc[1:3] = nan

In [11]: s
Out[11]:
2013-01-01 11:25:00   -0.69522
2013-01-01 11:30:00        NaN
2013-01-01 11:35:00        NaN
2013-01-01 11:40:00   -0.70308
2013-01-01 11:45:00    -1.5653
2013-01-01 11:50:00    0.95893
Freq: 5T, dtype: object

In [12]: s.interpolate(method='time')
Out[12]:
2013-01-01 11:25:00   -0.69522
2013-01-01 11:30:00        NaN
2013-01-01 11:35:00        NaN
2013-01-01 11:40:00   -0.70308
2013-01-01 11:45:00    -1.5653
2013-01-01 11:50:00    0.95893
Freq: 5T, dtype: object

In [13]: s.astype(float).interpolate(method='time')
Out[13]:
2013-01-01 11:25:00   -0.6952
2013-01-01 11:30:00   -0.6978
2013-01-01 11:35:00   -0.7005
2013-01-01 11:40:00   -0.7031
2013-01-01 11:45:00   -1.5653
2013-01-01 11:50:00    0.9589
Freq: 5T, dtype: float64

撰写回答