2016-01-21 85 views
0

我有一個帶有日期時間列和值列的數據框,我想找到一種方法來創建另一列,其中最接近給定時間的值在日期時間之前的間隔。找到最接近特定時間的數據幀中的值

我想要的是一個名爲「值2小時前」的列,並且此列的值對應於最接近2小時前的「值」列。

例如,如果「Date-Time」列顯示「01/01/2014 12:10:00」,則此新列將返回「Date-Time」行中的「Value」是最接近「01/01/2014 10:10:00」

更好的是,如果我可以根據實際時間間隔與期望的「2小時」間隔有多遠,對此值應用一些條件。例如,「返回距離2小時前最近的值,除非它小於1小時前或超過3小時前,則不返回任何內容」

舉例說明,下面是一個示例輸入數據框。我可以在2小時前輕鬆獲取該值,然後將其自動合併到兩個日期時間列中。挑戰在於讓這種合併成爲最接近的匹配,而不是完全匹配。

df = pd.DataFrame({'Date-Time' : pd.Series(["01/01/2014 04:11:00", "01/01/2014 08:10:00","01/01/2014 09:11:00","01/01/2014 12:10:00"], index=['1', '2','3', '4']),'Value' : pd.Series([9,12,3,21], index=['1', '2','3','4'])}) 
df["Time"]=pd.to_datetime(df["Time"]) 
df["t_2h_ago"]=df["Time"]-pd.to_timedelta('2h') 
merged=pd.merge(df,df,how='left',left_on='Time',right_on='t_2h_ago') 
+0

您是否嘗試編寫一些代碼來創建該列?在我看來,至少用簡單的方法很簡單。問一個更具體的問題,而不是僅僅描述一個需求就更好了。 – ohw

+0

我真的不知道從哪裏開始,所以我一直在尋找建議的方法或僞代碼。然而,從那以後,我發現了使用「最接近」方法的reindex,所以我認爲我應該能夠使用date-time列和一個計算列將時間2小時合併到數據框本身的副本前。我會嘗試,並作爲一個答案,如果它的作品。 –

回答

0

以笛卡爾產品。然後找出時間戳之間的差異。注意我假設每個日期時間在名爲nearest_time的函數中是唯一的。然後按組計算每組的最小值。對於每個組,這會以秒爲單位給出最接近的時間戳。然後回去。

from datetime import datetime 
import time 
import pandas as pd 
import numpy as np 
df = pd.DataFrame({'Date-Time' : pd.Series(["01/01/2014 04:11:00", "01/01/2014 08:10:00","01/01/2014 09:11:00","01/01/2014 12:10:00"], index=['1', '2','3', '4']),'Value' : pd.Series([9,12,3,21], index=['1', '2','3','4'])}) 

def nearest_time(x): 
    row_i= datetime.strptime(x['Date-Time_x'], "%m/%d/%Y %H:%M:%S") 
    row_j = datetime.strptime(x['Date-Time_y'], "%m/%d/%Y %H:%M:%S") 
    diff = time.mktime(row_i.timetuple()) - time.mktime(row_j.timetuple()) #seconds ex(2 hrs) 
    if diff == 0: diff = float('inf') 
    return abs(diff) 

df = df.copy() 
df['key']=1 
df = pd.merge(df,df,on='key') 
df['diff'] = df.apply(nearest_time,axis=1) 
df2 = df.copy() 
df2= df2.groupby(['Date-Time_x']).agg({'diff': np.min}) 
df2 = df2[['diff']] 
df2['Date-Time_x']=df2.index 

df3 = pd.merge(df2,df, on=['diff',"Date-Time_x"]) 
print df3 
+0

謝謝,但只給了我2小時前的時間,對吧?這可以用timedelta完成。我的問題更多,一旦我有2小時前的時間,我如何獲得與時間最接近的時間相關的價值。即如果沒有「01/01/2014 02:11:00」時間戳,那麼最接近它的時間戳是什麼以及與它關聯的值是多少?我認爲使用reindex與'最近'的方法是一個解決方案。我正在嘗試。 –

+0

我已經修復了我的答案,以更好地解決問題。大綱就是這樣。 對於每一行,查找時間戳和兩小時前的時間之間的差異。將所有這些值存儲在稱爲diff的列中。然後在列diff中找到最小值。 – goCards

+0

現在再次編輯,我對你正在尋找的內容有了更好的理解。 – goCards

相關問題