在熊猫中查找日期范围的麻烦

时间:2020-02-14 16:12:31

标签: python pandas date

我有一个数据集,其中包含主题列表,开始日期和结束日期。我正在尝试做一个循环,以便为每个主题提供开始日期和结束日期之间的日期列表。根据以前的帖子,我尝试了很多方法来执行此操作,但是仍然存在问题。

数据框示例:

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]]转换为时间戳

1 个答案:

答案 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)