我有一个数据集,其中包含主题列表,开始日期和结束日期。我正在尝试做一个循环,以便为每个主题提供开始日期和结束日期之间的日期列表。根据以前的帖子,我尝试了很多方法来执行此操作,但是仍然存在问题。
数据框示例:
Participant # Start_Date End_Date
1 23-04-19 25-04-19
我想要的输出示例:
Participant # Range
1 23-04-19
1 24-04-19
1 25-04-19
现在我的代码如下:
subjs_490 = tracksheet_490['Participant #']
for subj_490 in subjs_490:
temp_a = tracksheet_490[tracksheet_490['Participant #'].isin([subj_490])]
start = temp_a['Start_Date']
end = temp_a['End_Date'
start_dates = pd.to_datetime(pd.Series(start), format = '%d-%m-%y')
end_dates = pd.to_datetime(pd.Series(end), format = '%d-%m-%y')
date_range = pd.date_range(start_dates, end_dates).tolist()
使用这种方法时,出现以下错误:
无法将类型的输入[1 2016-05-03名称:Start_Date,dtype:datetime64 [ns]]转换为时间戳
答案 0 :(得分:1)
扩大范围往往是一个缓慢的过程。您可以先创建date_range
,然后创建explode
以获得所需的内容。将'Participant #'
移至索引可确保对所有爆炸的行重复执行该操作。
df = (df.set_index('Participant #')
.apply(lambda x: pd.date_range(x.start_date, x.end_date), axis=1) # :( slow
.rename('Range')
.explode()
.reset_index())
Participant # Range
0 1 2019-04-23
1 1 2019-04-24
2 1 2019-04-25
如果您不能使用explode
,则另一种选择是为每行创建一个单独的DataFrame,然后concat
将它们全部在一起。
pd.concat([pd.DataFrame({'Participant #': par, 'Range': pd.date_range(start, end)})
for par,start,end in zip(df['Participant #'], df['start_date'], df['end_date'])],
ignore_index=True)