如何将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)) 
+0

您的数据在哪里? –

+0

@cᴏʟᴅsᴘᴇᴇᴅ我试图避免数据混乱的页面。我希望这个问题相当清楚和简洁。示例时间戳将类似于“2017-03-09 14:36:06.516166”和“2017-03-09 14:51:07.661818”。 – BlandCorporation

+1

好吧,没有数据,用户将*在黑暗中拍摄:-(一个好办法是发布前5-10行,只有最重要的列:) –

我想添加一天的指数,然后使用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

这绝对是OP正在寻找的东西。很高兴你决定发表一个答案;我对我的感觉并不好,现在我可以平静地将它取出。谢谢! –

+0

谢谢@cᴏʟᴅsᴘᴇᴇᴅ。我很欣赏信心的投票。 – piRSquared

+0

@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 

我不能肯定是否是好的,但它似乎得到相同的答案。