Este es mi marco de datos
ID Date Value Final Value 0 9560 12/15/2021 30 5.0 1 9560 07/3/2021 25 5.0 2 9560 03/03/2021 20 20.0 3 9712 08/20/2021 15 5.0 4 9712 12/31/2021 10 10.0 5 9920 04/11/2021 5 5.0Aquí necesito crear otra columna 'Fecha redonda'. Obtenga la fecha de la columna 'Fecha' si la fecha es mayor que 15. La fecha debe redondearse a la fecha de inicio de ese mes o, de lo contrario, a la fecha de inicio del próximo mes. La salida esperada se da a continuación.
ID Date Value Final Value Round Date 0 9560 12/15/2021 30 5.0 12/01/2021 1 9560 07/3/2021 25 5.0 07/01/2021 2 9560 03/03/2021 20 20.0 03/01/2021 3 9712 08/20/2021 15 5.0 09/01/2021 4 9712 12/31/2021 10 10.0 01/01/2022 5 9920 04/11/2021 5 5.0 04/01/2021La solución se compone de algunos elementos:
crear una función para redondear una sola fecha. Aunque se puede usar una función lambda anónima, es mejor crear una función porque podemos probar la función (prueba unitaria) para ver si funciona de la manera que esperamos.
Primero necesitamos convertir la columna 'Fecha' en un tipo de fecha y hora. Para esto, podemos usar la función integrada de pandas pd.to_datetime().
Por último, para crear la columna 'Fecha redonda', simplemente llamaremos a apply() en la columna 'Fecha' y le daremos nuestra función de fecha redonda.
Aquí está el código para redondear la columna Fecha en el marco de datos de pandas:
from dateutil import relativedelta import pandas as pd # function to round date def round_date(date): # check if day is greater than 15 if date.day > 15: # change month to next month date += relativedelta.relativedelta(months=1) # change day to start of month date = date.replace(day=1) return date # read data df = pd.read_csv('your-path') # change date column to datetime df['Date'] = pd.to_datetime(df['Date'] ) # apply round date function to column df['Round Date'] = df['Date'].apply(round_date)Aporte:
ID Date Value Final Value 0 9560 12/15/2021 30 5.0 1 9560 07/03/2021 25 5.0 2 9560 03/03/2021 20 20.0 3 9712 08/20/2021 15 5.0 4 9712 12/31/2021 10 10.0 5 9920 04/11/2021 5 5.0Producción:
ID Date Value Final Value Round Date 0 9560 12/15/2021 30 5.0 12/01/2021 1 9560 07/03/2021 25 5.0 07/01/2021 2 9560 03/03/2021 20 20.0 03/01/2021 3 9712 08/20/2021 15 5.0 09/01/2021 4 9712 12/31/2021 10 10.0 01/01/2022 5 9920 04/11/2021 5 5.0 04/01/2021Usando numpy's where :
import pandas as pd import numpy as np df["Date"] = pd.to_datetime(df.date) df["date.rounded"] = np.where( df.Date.dt.day > 15, df.Date + pd.offsets.MonthBegin(0), df.Date + pd.offsets.MonthEnd(0) - pd.offsets.MonthBegin(1) )Esto produce:
Date date.rounded 0 2021-12-15 2021-12-01 1 2021-07-03 2021-07-01 2 2021-03-03 2021-03-01 3 2021-08-20 2021-09-01 4 2021-12-31 2022-01-01 5 2021-04-11 2021-04-01pd.to_datetime()apply() y la función lambda para establecer el día en 1 y aumentar el valor del mes si el día de la condición es mayor que 15Código:
import pandas as pd from datetime import timedelta from dateutil.relativedelta import relativedelta df = pd.DataFrame({'Date': ['2/1/2021', '01/31/2021', '12/31/2021', '2021-12-01']}) df.Date = pd.to_datetime(df.Date) df['Round Date'] = df.Date.apply(lambda x: x.replace(day=1)+ relativedelta(months=1) if x.day > 15 else x.replace(day=1))Aporte:
Date 0 2/1/2021 1 01/31/2021 2 12/31/2021 3 2021-12-01Producción:
Date Round Date 0 2021-02-01 2021-02-01 1 2021-01-31 2021-02-01 2 2021-12-31 2022-01-01 3 2021-12-01 2021-12-01