我有两个数据帧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 in1d
和pandas normalize
函数以长时间的方式完成此任务。我一直在寻找pythonic方法来实现这一目标。
答案 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()
DF
包含DateTimeIndex
作为日期+时间属性:
df2 = pd.DataFrame(np.random.randint(0,10,(100,2)), idx2)
df2.head()
只考虑匹配日期作为区分参数来获取公共索引。
intersect = pd.Index(df2.index.date).intersection(df1.index)
第一个常见索引DF
,其中包含原始数据框的列:
df11 = df1.loc[intersect]
df11
第二个常见索引DF
,其中包含原始数据框的列:
df22 = df2.iloc[np.where(df2.index.date.reshape(-1,1) == intersect.values)[0]]
df22