当前位置: 首页 > 知识库问答 >
问题:

基于datetime的数据帧内部连接

康弘义
2023-03-14

我有两个数据帧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)

i、 e.df1的索引为天,df2的索引为日期时间。我想在索引上执行DF1和DF2的内部连接,这样如果DF2中对应于DF2的时间在DF1中可用,则我们认为内部连接为真,否则为假。

我想获得两个df11和df22作为输出. df11将有共同的日期和相应的列从df1. df22将有共同的日期小时和相应的列从df2.

"例如df1中的"2002-08-04"和df2中的"2002-08-04 01:00:00"被认为存在于这两个文件中。"

但是,如果df1中的'1802-08-04'在df2中没有小时,则在df11中不存在。

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

现在我正在使用numpyinadpandas normalize函数以冗长的方式完成这项任务。我一直在寻找一种类似蟒蛇的方法来达到这个目的。

共有1个答案

孟和玉
2023-03-14

考虑一个虚构<代码> 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
 类似资料:
  • 基于“SC”代码,我需要将SRCTable与RefTable-1或RefTable-2连接起来 条件:如果SC为“D”,则SRCTable在KEY=KEY1上与RefTable-1连接以获得值。否则,如果SC为“U”,则SRCTable与键=键2上的RefTable-2连接 这是输入spark数据帧。 预期产出: 注意:输入表将有数百万条记录,因此需要一个优化的解决方案

  • 使用Spark SQL,我有两个数据帧,它们是从一个数据帧创建的,例如: 我想过滤df1,如果它的“路径”的一部分是df2中的任何路径。所以如果df1有路径为“a/b/c/d/e”的行,我会找出df2中是否有路径为“a/b/c”的行。SQL应该是这样 其中udf是用户定义的函数,用于缩短df1的原始路径。简单的解决方案是使用JOIN,然后过滤结果,但这很慢,因为df1和df2都有超过10mil的行

  • 我在pyspark有两个数据框。如下所示,df1保存来自传感器的整个long_lat。第二个数据帧df2是第一个数据帧的子集,其中lat-long值被向上舍入到2位小数,然后删除重复项以保留唯一的lat_long数据点。 DF1: df2: 因此,df2 的行数比第一个少得多。在 df2 中,我应用了一个 udf 来计算状态名称。 现在我想在 df1 中填充状态名称。由于 df2 的 lat_lo

  • 我正在尝试基于第二个数据框的值周围的范围创建一个数据框的子集,我一直在进行研究,但我就是想不出如何去做。我在这里使用了虚拟数据,因为它们都是包含许多列的大型数据集。 数据帧1(df1)有50列,数千条不同纬度的记录 数据帧2(df2)有数百个城镇,都位于不同纬度,比df1小得多 我需要df1的一个子集,它只包括纬度在df2纬度0.01范围内的行。所以代码需要查看df1的每一行,并根据df2的每一行

  • 我有两个具有大量(几百万到几千万)行的数据帧。我想为他们牵线搭桥。 在我目前使用的BI系统中,您可以通过首先对特定键进行分区,然后在该键上进行连接来快速完成此操作。 这是我在Spark中需要遵循的模式吗,或者这并不重要?乍一看,在分区之间转移数据似乎浪费了很多时间,因为没有正确地进行预分区。 如果有必要,我该怎么做?

  • 我有两个数据帧df1和df2。df1就像一个具有以下值的字典 df2具有以下值: 我想基于df1数据帧中的,将df2拆分为3个新的数据帧。 日期,TLRA_权益栏应位于数据框 预期产出: > 数据帧 消费者,非周期性数据帧 请让我知道如何有效地做。我想做的是连接列名,例如,然后根据列名的前半部分分割数据帧。 代码: 但这很复杂。需要更好的解决方案。