我有一个带有日期时间列和值列的数据框,我想找到一种方法来创建另一个列,其中的值最接近日期时间之前的给定间隔。< / p>
我想要的是有一个名为&#34; 2小时前的值&#34;,并且此列的值对应于&#34;值&#34;最近2小时前的列。
例如,如果&#34;日期时间&#34;列显示&#34; 01/01/2014 12:10:00&#34;,这个新列将返回&#34; Value&#34;中的数字。在&#34;日期时间&#34;最接近&#34; 01/01/2014 10:10:00&#34;
如果我可以根据实际时间间隔距离所需的时间(2小时&#34;间隔。例如,&#34;返回最接近2小时前的值,除非它小于1小时前或超过3小时前,然后不返回&#34;
为了说明,这是一个示例输入数据帧。我可以在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 :(得分: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