使用 python 从 csv 获取指定开始日期和结束日期之间的日期范围

Get range of dates between specified start and end date from csv using python

我有一个包含 StartDate 和 EndDate 的 CSV 文件,请考虑 01-02-2020 00:00:00 和 01-03-2020 00:00:00

我想要一个 python 程序来查找日期之间的日期并追加到下一行,例如

所以这里应该增加 Startdate 而不是点,并保持 End 日期不变。

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

例如,如果我将 StartDate 设为 01-02-2020 00:00:00,将 EndDate 设为 05-02-2020 00:00:00

结果我应该得到

所有结果 DateTime 的格式应与 MyData.Csv StartDate 和 EndDate

中的格式相同

只有 StartDate 会变,其他应该一样

我试着用日期范围来做。但我没有得到任何结果。谁能帮我解决这个问题。

谢谢

这样的东西能达到你想要的吗?

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

我的两分钱:一个非常简单的解决方案,仅基于 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)

如果df是:

   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

那么 date_df 将是:

             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

然后您可以使用 to_csv 方法将结果保存回 CSV 文件。

实际上你提供的代码对我有用。我想您唯一需要更改的是读写操作中的日期格式,以确保与您的要求一致。特别是,您应该在读取时利用 dayfirst 参数,在写入输出文件时利用 date_format 参数。下面是一个玩具示例:

玩具资料

StartDate EndDate A B C
01-02-2020 00:00:00 06-02-2020 00:00:00 ME ME ME
01-04-2020 00:00:00 04-04-2020 00:00:00 PE PE PE

示例代码

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)

除了 StartDate 也是日期时间格式之外,输出就是您所描述的。这是否回答了您的问题?