使用循环使用DateOffSet计算各种天数差异

时间:2017-02-28 08:35:31

标签: python python-2.7 date pandas datetime

在接下来的五个星期六成名:

start_date =
0    04.03.2017
1    11.03.2017
2    18.03.2017
3    25.03.2017
4    01.04.2017

和我用来计算end_dates的列表

duration = [4, 8, 15, 22].

我想创建一个基于start_date加上持续时间的新帧,例如

start_date[0] = duration[0] = 07.03.2017
start_date[1] = duration[0] = 11.03.2017
start_date[2] = duration[0] = 18.03.2017
...

我尝试使用pd.DateOffset解决这个问题:

for j in range(len(duration)):
  end_date = []
  for i in start_dates:
      # get offset date, convert it and append it to end_date list
      z = pd.to_datetime(i) + pd.DateOffset(days=duration[(j)])
      end_date.append(z.strftime("%d.%m.%Y"))

但是,我得到以下输出:

['07.04.2017', '07.11.2017', '22.03.2017', '29.03.2017', '08.01.2017']

问题出在哪里?是因为DateOffset功能吗?不幸的是,我看不出有关出口的模式。

任何提示?

谢谢,Mark

2 个答案:

答案 0 :(得分:0)

问题不在于DateOffset()。问题是您将日期字符串传递给pandas时没有指定日期格式。

所以大熊猫正在猜测日期格式。您应该做的是在使用format时传递to_datetime()参数。

df
   start_date
0  04.03.2017
1  11.03.2017
2  18.03.2017
3  25.03.2017
4  01.04.2017

df['py_start_date'] = pd.to_datetime(df['start_date'], format='%d.%m.%Y')

   start_date py_start_date
0  04.03.2017      2017-03-04
1  11.03.2017      2017-03-11
2  18.03.2017      2017-03-18
3  25.03.2017      2017-03-25
4  01.04.2017      2017-04-01

for d in duration:
    df['offset {}'.format(d)] = df['py_start_date'] + pd.DateOffset(days=d)

    start_date py_start_date   offset 4   offset 8  offset 15  offset 22
0  04.03.2017      2017-03-04 2017-03-08 2017-03-12 2017-03-19 2017-03-26
1  11.03.2017      2017-03-11 2017-03-15 2017-03-19 2017-03-26 2017-04-02
2  18.03.2017      2017-03-18 2017-03-22 2017-03-26 2017-04-02 2017-04-09
3  25.03.2017      2017-03-25 2017-03-29 2017-04-02 2017-04-09 2017-04-16
4  01.04.2017      2017-04-01 2017-04-05 2017-04-09 2017-04-16 2017-04-23

答案 1 :(得分:0)

使用try&错误我找到了另一个解决方案(已测试)

for j in range(len(duration)):
  date_offset = []
  for i in start_dates:
     k = duration[j]
     d = datetime.datetime.strptime(i, "%d.%m.%Y")
     d = d + datetime.timedelta(days=k)
     date_offset.append(d.strftime("%d.%m.%Y"))

  # Transfer date_offset list into four seperate offset series depending on k
  if k == 4:
     offset_4 = pd.Series(date_offset)
  elif k == 8:
     offset_8 = pd.Series(date_offset)
  elif k == 15:
     offset_15 = pd.Series(date_offset) 
  else:
     offset_22 = pd.Series(date_offset)

我知道它与以前发布的解决方案相比并不那么优雅,但它也有效。 ;)