Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

393
Visualizações
Encuentra la superposición del rango de fechas en python

Estoy tratando de encontrar una forma más eficiente de encontrar rangos de datos superpuestos (fechas de inicio/finalización proporcionadas por fila) en un marco de datos basado en una columna específica (id). El marco de datos se ordena en la columna 'desde'. Creo que hay una manera de evitar la función de doble apply como lo hice yo:

 import pandas as pd from datetime import datetime df = pd.DataFrame(columns=['id','from','to'], index=range(5), \ data=[[878,'2006-01-01','2007-10-01'], [878,'2007-10-02','2008-12-01'], [878,'2008-12-02','2010-04-03'], [879,'2010-04-04','2199-05-11'], [879,'2016-05-12','2199-12-31']]) df['from'] = pd.to_datetime(df['from']) df['to'] = pd.to_datetime(df['to']) id from to 0 878 2006-01-01 2007-10-01 1 878 2007-10-02 2008-12-01 2 878 2008-12-02 2010-04-03 3 879 2010-04-04 2199-05-11 4 879 2016-05-12 2199-12-31

Usé la función "aplicar" para recorrer todos los grupos y dentro de cada grupo, uso "aplicar" por fila:

 def check_date_by_id(df): df['prevFrom'] = df['from'].shift() df['prevTo'] = df['to'].shift() def check_date_by_row(x): if pd.isnull(x.prevFrom) or pd.isnull(x.prevTo): x['overlap'] = False return x latest_start = max(x['from'], x.prevFrom) earliest_end = min(x['to'], x.prevTo) x['overlap'] = int((earliest_end - latest_start).days) + 1 > 0 return x return df.apply(check_date_by_row, axis=1).drop(['prevFrom','prevTo'], axis=1) df.groupby('id').apply(check_date_by_id) id from to overlap 0 878 2006-01-01 2007-10-01 False 1 878 2007-10-02 2008-12-01 False 2 878 2008-12-02 2010-04-03 False 3 879 2010-04-04 2199-05-11 False 4 879 2016-05-12 2199-12-31 True

Mi código se inspiró en los siguientes enlaces:

  • ¿Cálculo de superposición de rango de fechas eficiente en python?

  • ¿Cómo encontrar superposición de rango en python?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Simplemente puede cambiar la columna to y realizar una resta directa de las fechas y horas.

 df['overlap'] = (df['to'].shift()-df['from']) > timedelta(0)

Aplicar esto mientras se agrupa por id puede parecer

 df['overlap'] = (df.groupby('id') .apply(lambda x: (x['to'].shift() - x['from']) > timedelta(0)) .reset_index(level=0, drop=True))

Manifestación

 >>> df id from to 0 878 2006-01-01 2007-10-01 1 878 2007-10-02 2008-12-01 2 878 2008-12-02 2010-04-03 3 879 2010-04-04 2199-05-11 4 879 2016-05-12 2199-12-31 >>> df['overlap'] = (df.groupby('id') .apply(lambda x: (x['to'].shift() - x['from']) > timedelta(0)) .reset_index(level=0, drop=True)) >>> df id from to overlap 0 878 2006-01-01 2007-10-01 False 1 878 2007-10-02 2008-12-01 False 2 878 2008-12-02 2010-04-03 False 3 879 2010-04-04 2199-05-11 False 4 879 2016-05-12 2199-12-31 True
over 4 years ago · Santiago Trujillo Relatório

0

Puede comparar el tiempo 'desde' con el tiempo 'hasta' anterior:

 df['to'].shift() > df['from']

Producción:

 0 False 1 False 2 False 3 False 4 True
over 4 years ago · Santiago Trujillo Relatório

0

Otra solución. Esto podría reescribirse para aprovechar Interval.overlaps en pandas 24 y versiones posteriores.

 def overlapping_groups(group): if len(group) > 1: for index, row in group.iterrows(): for index2, row2 in group.drop(index).iterrows(): int1 = pd.Interval(row2['start_date'],row2['end_date'], closed = 'both') if row['start_date'] in int1: return row['id'] if row['end_date'] in int1: return row['id'] gcols = ['id'] group_output = df.groupby(gcols,group_keys=False).apply(overlapping_groups) ids_with_overlap = set(group_output[~group_output.isnull()].reset_index(drop = True)) df[df['id'].isin(ids_with_overlap)]
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda