2016-01-21 83 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

相关问题