使用循环使用DateOffset计算几天的各种差异



在接下来的五个星期六给定名声:

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函数吗?不幸的是,我无法看到有关导出的模式。

有任何提示?

谢谢,马克

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

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

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

使用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)

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

最新更新