使用 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
也是日期时间格式之外,输出就是您所描述的。这是否回答了您的问题?
我有一个包含 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
也是日期时间格式之外,输出就是您所描述的。这是否回答了您的问题?