2017-10-08 56 views
1

我有一個值的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行,只有最重要的列:) –

回答

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

這絕對是OP正在尋找的東西。很高興你決定發表一個答案;我對我的感覺並不好,現在我可以平靜地將它取出。謝謝! –

+0

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

+0

@BlandCorporation唯一棘手的部分是理解你的意思。你可以通過編輯你的帖子來修復這種困惑,並且包括你認爲結果應該是什麼。正如你所描述的那樣,我認爲我提供的就是這樣做的。 60分到50分之前是~24小時之前是1.2分。 – piRSquared

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 

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