Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

150
Views
Expansión del marco de datos de pandas con rango de fechas en columnas

Tengo un marco de datos de pandas con fechas y cadenas similares a esta:

 Start End Note Item 2016-10-22 2016-11-05 ZA 2017-02-11 2017-02-25 WB

Necesito expandirlo/transformarlo a lo siguiente, completando semanas (W-SAT) entre las columnas Inicio y Fin y reenviar completando los datos en Nota y Elementos :

 Start Note Item 2016-10-22 ZA 2016-10-29 ZA 2016-11-05 ZA 2017-02-11 WB 2017-02-18 WB 2017-02-25 WB

¿Cuál es la mejor manera de hacer esto con pandas? ¿Se aplica algún tipo de índice múltiple?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Puede iterar sobre cada fila y crear un nuevo marco de datos y luego concatenarlos juntos

 pd.concat([pd.DataFrame({'Start': pd.date_range(row.Start, row.End, freq='W-SAT'), 'Note': row.Note, 'Item': row.Item}, columns=['Start', 'Note', 'Item']) for i, row in df.iterrows()], ignore_index=True) Start Note Item 0 2016-10-22 ZA 1 2016-10-29 ZA 2 2016-11-05 ZA 3 2017-02-11 WB 4 2017-02-18 WB 5 2017-02-25 WB
over 4 years ago · Santiago Trujillo Report

0

No necesitas iteración en absoluto.

 df_start_end = df.melt(id_vars=['Note','Item'],value_name='date') df = df_start_end.groupby('Note').apply(lambda x: x.set_index('date').resample('W').pad()).drop(columns=['Note','variable']).reset_index()
over 4 years ago · Santiago Trujillo Report

0

Si la cantidad de valores únicos de df['End'] - df['Start'] no es demasiado grande, pero la cantidad de filas en su conjunto de datos es grande, entonces la siguiente función será mucho más rápida que recorrer su conjunto de datos:

 def date_expander(dataframe: pd.DataFrame, start_dt_colname: str, end_dt_colname: str, time_unit: str, new_colname: str, end_inclusive: bool) -> pd.DataFrame: td = pd.Timedelta(1, time_unit) # add a timediff column: dataframe['_dt_diff'] = dataframe[end_dt_colname] - dataframe[start_dt_colname] # get the maximum timediff: max_diff = int((dataframe['_dt_diff'] / td).max()) # for each possible timediff, get the intermediate time-differences: df_diffs = pd.concat([pd.DataFrame({'_to_add': np.arange(0, dt_diff + end_inclusive) * td}).assign(_dt_diff=dt_diff * td) for dt_diff in range(max_diff + 1)]) # join to the original dataframe data_expanded = dataframe.merge(df_diffs, on='_dt_diff') # the new dt column is just start plus the intermediate diffs: data_expanded[new_colname] = data_expanded[start_dt_colname] + data_expanded['_to_add'] # remove start-end cols, as well as temp cols used for calculations: to_drop = [start_dt_colname, end_dt_colname, '_to_add', '_dt_diff'] if new_colname in to_drop: to_drop.remove(new_colname) data_expanded = data_expanded.drop(columns=to_drop) # don't modify dataframe in place: del dataframe['_dt_diff'] return data_expanded
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!