Python 在大熊猫身上寻找日期范围的麻烦
我有一个数据集,它有一个主题列表、一个开始日期和一个结束日期。我试图做一个循环,这样对于每个主题,我都有一个开始日期和结束日期之间的日期列表。基于之前的文章,我尝试了很多方法来实现这一点,但仍然存在一些问题 数据帧的一个示例:Python 在大熊猫身上寻找日期范围的麻烦,python,pandas,date,Python,Pandas,Date,我有一个数据集,它有一个主题列表、一个开始日期和一个结束日期。我试图做一个循环,这样对于每个主题,我都有一个开始日期和结束日期之间的日期列表。基于之前的文章,我尝试了很多方法来实现这一点,但仍然存在一些问题 数据帧的一个示例: Participant # Start_Date End_Date 1 23-04-19 25-04-19 我想要的输出示例如下: Participant # Range
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 Name:Start_Date,dtype:datetime64[ns]]转换为时间戳扩展范围的过程往往很慢。您可以创建
date\u范围
,然后将其分解
以获得所需内容。将'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())
如果不能使用
explode
另一个选项是为每行创建一个单独的数据帧,然后将它们全部合并到一起
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)
那么这是否应该替换整个循环?@code\u newbie是的,如果您只需要参与者的数据帧,并且每行都是范围内的日期,那么它可以替换整个循环。apply axis=1仍然是行上的循环,因此您没有真正删除该循环。但我不认为有一种方法可以以这种或那种方式循环。@Alolz谢谢你!我没有收到错误AttributeError:“Series”对象没有在0.24.0中添加的属性“explode”@code_newbie,该属性是在几个版本之前添加的。如果可以,我建议升级。但我也可以提供一个不使用explode的替代方案,给我几分钟时间
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)