基于日期时间的

时间:2016-11-29 15:28:53

标签: python pandas dataframe

我有两个数据帧df1和df2。

df1.index
DatetimeIndex(['2001-09-06', '2002-08-04', '2000-01-22', '2000-12-19',
               '2008-02-09', '2010-07-07', '2011-06-04', '2007-03-14',
               '2003-05-17', '2016-02-27',..dtype='datetime64[ns]', name=u'DateTime', length=6131, freq=None)

df2.index
DatetimeIndex(['2002-01-01 01:00:00', '2002-01-01 10:00:00',
               '2002-01-01 11:00:00', '2002-01-01 12:00:00',
               '2002-01-01 13:00:00', '2002-01-01 14:00:00',..dtype='datetime64[ns]', length=129273, freq=None)

即。 df1的索引为天,df2的索引为datetime。我想在索引上执行df1和df2的内连接,这样如果在df1中对应于df2中的小时的日期,我们认为内连接为true,否则为false。

我想获得两个df11和df22作为输出。 df11将具有df1的公共日期和相应列。 df22将具有共同的日期时间和来自df2的相应列。

E.g。 ' 2002-08-04'在df1和' 2002-08-04 01:00:00'在df2中,两者都被认为存在。

然而,如果' 1802-08-04'在df1中,df2中没有小时,df11中不存在。

但是如果' 2045-08-04 01:00:00'在df2中,df1中没有日期,它在df22中不存在。

现在我正在使用numpy in1dpandas normalize函数以长时间的方式完成此任务。我一直在寻找pythonic方法来实现这一目标。

1 个答案:

答案 0 :(得分:2)

考虑如下所示构建的虚拟DF

idx1 = pd.date_range(start='2000/1/1', periods=100, freq='12D')
idx2 = pd.date_range(start='2000/1/1', periods=100, freq='300H')
np.random.seed([42, 314])
仅包含DF作为日期属性的

DateTimeIndex

df1 = pd.DataFrame(np.random.randint(0,10,(100,2)), idx1)
df1.head()

enter image description here

DF包含DateTimeIndex作为日期+时间属性:

df2 = pd.DataFrame(np.random.randint(0,10,(100,2)), idx2)
df2.head()

enter image description here

只考虑匹配日期作为区分参数来获取公共索引。

intersect = pd.Index(df2.index.date).intersection(df1.index)

第一个常见索引DF,其中包含原始数据框的列:

df11 = df1.loc[intersect]
df11

enter image description here

第二个常见索引DF,其中包含原始数据框的列:

df22 = df2.iloc[np.where(df2.index.date.reshape(-1,1) == intersect.values)[0]]
df22

enter image description here