如何将DataFrame转移到指定的时间索引的最近时间索引?

时间:2017-10-08 22:40:29

标签: python pandas dataframe shift

我记录了一个DataFrame值,并将索引设置为DatetimeIndex。大约每15分钟记录一次值。

我想添加一个新列,它是当前值与24小时前的值的小数差。由于值每隔十五分钟记录大约,我想转移到最接近24小时的时间索引。如果我尝试这样做,我最终会得到很多NaN s:

df["value"] / df["value"].shift(freq = datetime.timedelta(days = -1))

如何进行这种转变,以便转移到指定距离的最近可能的时间指数?是否有另一种更容易思考的方法?

以下是一个说明问题的示例:

df = pd.DataFrame(
    [
        [pd.Timestamp("2015-07-18 13:53:33.280"), 10],
        [pd.Timestamp("2015-07-19 13:54:03.330"), 20],
        [pd.Timestamp("2015-07-20 13:52:13.350"), 30],
        [pd.Timestamp("2015-07-21 13:56:03.126"), 40],
        [pd.Timestamp("2015-07-22 13:53:51.747"), 50],
        [pd.Timestamp("2015-07-23 13:53:29.346"), 60]
    ],
    columns = [
        "datetime",
        "value"
    ]
)

df.index = df["datetime"]
del df["datetime"]
df.index = pd.to_datetime(df.index.values)

df["change"] = df["value"] / df["value"].shift(freq = datetime.timedelta(days = -1))

2 个答案:

答案 0 :(得分:2)

我将一天添加到索引中,然后将pd.DataFrame.reindexmethod='nearest'

一起使用
df / df.set_index(df.index + pd.offsets.Day()).reindex(df.index, method='nearest')

                            value
2015-07-18 13:53:33.280  1.000000
2015-07-19 13:54:03.330  2.000000
2015-07-20 13:52:13.350  1.500000
2015-07-21 13:56:03.126  1.333333
2015-07-22 13:53:51.747  1.250000
2015-07-23 13:53:29.346  1.200000

您可以在method='nearest'

上提供另一个偏差作为容差
df / df.set_index(df.index + pd.offsets.Day()).reindex(
    df.index, method='nearest', tolerance=pd.offsets.Hour(12))

                            value
2015-07-18 13:53:33.280       NaN
2015-07-19 13:54:03.330  2.000000
2015-07-20 13:52:13.350  1.500000
2015-07-21 13:56:03.126  1.333333
2015-07-22 13:53:51.747  1.250000
2015-07-23 13:53:29.346  1.200000

答案 1 :(得分:0)

按照您的代码:

df/df.shift(1)

                        value
2015-07-18 13:53:33.280 NaN
2015-07-19 13:54:03.330 2.000000
2015-07-20 13:52:13.350 1.500000
2015-07-21 13:56:03.126 1.333333
2015-07-22 13:53:51.747 1.250000
2015-07-23 13:53:29.346 1.200000

我不确定它是否可以,但它似乎得到了同样的答案。