如何将DataFrame移动到指定的最近时间索引?
我有一个值的DataFrame记录和索引设置为DatetimeIndex。大约每15分钟记录一次数值。如何将DataFrame移动到指定的最近时间索引?
我想添加一个新的列,它是当前值与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))
我想添加一天的指数,然后使用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
您可以提供另一个偏移量公差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
个
这绝对是OP正在寻找的东西。很高兴你决定发表一个答案;我对我的感觉并不好,现在我可以平静地将它取出。谢谢! –
谢谢@cᴏʟᴅsᴘᴇᴇᴅ。我很欣赏信心的投票。 – piRSquared
@BlandCorporation唯一棘手的部分是理解你的意思。你可以通过编辑你的帖子来修复这种困惑,并且包括你认为结果应该是什么。正如你所描述的那样,我认为我提供的就是这样做的。 60分到50分之前是~24小时之前是1.2分。 – piRSquared
作为后续代码:
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”。 – BlandCorporation
好吧,没有数据,用户将被迫在黑暗中拍摄:-(一个好办法是发布前5-10行,只有最重要的列:) –