Obtenga el rango de fechas entre la fecha de inicio y finalización especificada de csv usando python

Tengo un problema en el que tengo un archivo CSV con StartDate y EndDate, considere 01-02-2020 00:00:00 y 01-03-2020 00:00:00

Y quiero un programa de python que encuentre las fechas entre las fechas y las agregue en las siguientes filas como

Archivo CSV

Así que aquí, en lugar de dot , debería incrementar la fecha de inicio y mantener la fecha de finalización tal como está.

import pandas as pd

df = pd.read_csv('MyData.csv')

df['StartDate'] = pd.to_datetime(df['StartDate'])
df['EndDate'] = pd.to_datetime(df['EndDate'])
df['Dates'] = [pd.date_range(x, y) for x , y in zip(df['StartDate'],df['EndDate'])]
df = df.explode('Dates')
df

Entonces, por ejemplo, si tengo StartDate como 01-02-2020 00:00:00 y EndDate como 05-02-2020 00:00:00

Como resultado debo obtener

Resultado

Todo el resultado DateTime debe estar en el mismo formato que en MyData.Csv StartDate y EndDate

Solo cambiará la fecha de inicio, el resto debe ser igual

Intenté hacerlo con rango de fechas. Pero no obtengo ningún resultado. ¿Alguien puede ayudarme con esto?

Gracias

Answer

Mis dos centavos: una solución muy simple basada solo en funciones de pandas:

import pandas as pd

# Format of the dates in 'MyData.csv'
DT_FMT = '%m-%d-%Y %H:%M:%S'

df = pd.read_csv('MyData.csv')

# Parse dates with the provided format
for c in ('StartDate', 'EndDate'):
    df[c] = pd.to_datetime(df[c], format=DT_FMT)

# Create the DataFrame with the ranges of dates
date_df = pd.DataFrame(
    data=[[d] + list(row[1:])
          for row in df.itertuples(index=False, name=None)
          for d in pd.date_range(row[0], row[1])],
    columns=df.columns.copy()
)

# Convert dates to strings in the same format of 'MyData.csv'
for c in ('StartDate', 'EndDate'):
    date_df[c] = date_df[c].dt.strftime(DT_FMT)

si dfes:

   StartDate    EndDate   A   B   C
0 2020-01-02 2020-01-06  ME  ME  ME
1 2021-05-15 2021-05-18  KI  KI  KI

entonces date_dfserá:

             StartDate              EndDate   A   B   C
0  01-02-2020 00:00:00  01-06-2020 00:00:00  ME  ME  ME
1  01-03-2020 00:00:00  01-06-2020 00:00:00  ME  ME  ME
2  01-04-2020 00:00:00  01-06-2020 00:00:00  ME  ME  ME
3  01-05-2020 00:00:00  01-06-2020 00:00:00  ME  ME  ME
4  01-06-2020 00:00:00  01-06-2020 00:00:00  ME  ME  ME
5  05-15-2021 00:00:00  05-18-2021 00:00:00  KI  KI  KI
6  05-16-2021 00:00:00  05-18-2021 00:00:00  KI  KI  KI
7  05-17-2021 00:00:00  05-18-2021 00:00:00  KI  KI  KI
8  05-18-2021 00:00:00  05-18-2021 00:00:00  KI  KI  KI

Luego puede guardar el resultado en un archivo CSV con el to_csvmétodo.

¿Algo como esto logra lo que quieres?

from datetime import datetime, timedelta

date_list = []
for base, end in zip(df['StartDate'], df['EndDate']):
    d1 = datetime.strptime(base, "%d-%m-%Y %H:%M:%S")
    d2 = datetime.strptime(end, "%d-%m-%Y %H:%M:%S")
    numdays = abs((d2 - d1).days)
    basedate = datetime.strptime(base, "%d-%m-%Y %H:%M:%S")
    date_list += [basedate - timedelta(days=x) for x in range(numdays)]

df['Dates'] = date_list

En realidad, el código que proporcionaste está funcionando para mí. Supongo que lo único que necesita cambiar es el formato de fecha en las operaciones de lectura y escritura para asegurarse de que sea consistente con sus requisitos. En particular, debe aprovechar el dayfirstargumento al leer y date_formatal escribir el archivo de salida. Un ejemplo de juguete a continuación:

Datos de juguetes

Fecha de inicio Fecha final A B C
01-02-2020 00:00:00 02-06-2020 00:00:00 YO YO YO
01-04-2020 00:00:00 04-04-2020 00:00:00 SOBRE SOBRE SOBRE

Código de muestra

import pandas as pd
s_dates = ['01-02-2020', '01-03-2020']
e_dates = ['01-04-2020', '01-05-2020']

df = pd.read_csv('dataSO.csv', parse_dates=[0,1], dayfirst=True)
cols = df.columns

df['Dates'] = [pd.date_range(x, y) for x , y in zip(df['StartDate'],df['EndDate'])]
df1 = df.explode('Dates')[cols]
df1.to_csv('resSO.csv', date_format="%d-%m-%Y %H:%M:%S", index=False)

Y el resultado es lo que describió, excepto por el hecho de que StartDatetambién está en formato de fecha y hora. ¿Responde esto a tu pregunta?