Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在大熊猫身上寻找日期范围的麻烦_Python_Pandas_Date - Fatal编程技术网

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)