在接下来的五个星期六成名:
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
答案 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)
我知道它与以前发布的解决方案相比并不那么优雅,但它也有效。 ;)