Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将数据帧移动到与指定时间索引最接近的时间索引?_Python_Pandas_Dataframe_Shift - Fatal编程技术网

Python 如何将数据帧移动到与指定时间索引最接近的时间索引?

Python 如何将数据帧移动到与指定时间索引最接近的时间索引?,python,pandas,dataframe,shift,Python,Pandas,Dataframe,Shift,我有一个记录值的数据帧,索引设置为DatetimeIndex。大约每15分钟记录一个值 我想添加一个新列,它是当前值与24小时前的值的分数差。由于这些值大约每15分钟记录一次,因此我想切换到最接近24小时前的时间索引。如果我试图做到这一点,我最终会得到大量的NaNs: df["value"] / df["value"].shift(freq = datetime.timedelta(days = -1)) 应如何进行此转换,以便转换到最接近指定时间索引的时间索引?有没有其他更简单的方法来考虑这

我有一个记录值的数据帧,索引设置为DatetimeIndex。大约每15分钟记录一个值

我想添加一个新列,它是当前值与24小时前的值的分数差。由于这些值大约每15分钟记录一次,因此我想切换到最接近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))

我会在索引中添加一天,然后使用
pd.DataFrame.reindex
method='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
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

您可以在
方法='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
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
请遵循您的代码:

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

我不确定是否正确,但似乎得到了相同的答案。

您的数据在哪里?@cᴏʟᴅsᴘᴇᴇᴅ 我试图避免页面上的数据乱七八糟。我希望这个问题相当清楚和简洁。示例时间戳类似于
2017-03-09 14:36:06.516166
2017-03-09 14:51:07.661818
ᴏʟᴅsᴘᴇᴇᴅ 好的,我来举一个简单的例子。@cᴏʟᴅsᴘᴇᴇᴅ 对,我添加了示例代码。:)这肯定更符合OP的要求。很高兴你决定发布答案;我的感觉不太好,现在我可以平静地把它拿走了。非常感谢。谢谢@cᴏʟᴅsᴘᴇᴇᴅ. 我很感激你投下的信任票。@BlandCorporation唯一棘手的是理解你的意思。你可以通过编辑你的文章并包括你认为结果应该是什么来纠正这种混乱。正如你所描述的,我认为我提供的正是这样。60除以50,24小时之前的值为1.2。