Pandas:将timedelta列添加到datetime列(矢量化)

fly*_*all 13 vectorization timedelta pandas

我有一个pandas数据框,有两列,一个日期列和一个int列,我只想将int列(以天为单位)添加到日期列.我找到了一个使用df.apply()的解决方案,但这对我的完整数据集来说太慢了.我没有看到大量关于以矢量化方式进行此操作的文档(我能找到的最接近的是这个),所以我想确保我找到的解决方案是最好的方法.

我的原始数据只是一列字符串作为一列int(天).

import pandas as pd
from datetime import timedelta

df = pd.DataFrame([['2016-01-10',28],['2016-05-11',28],['2016-02-23',15],['2015-12-08',30]], 
                  columns = ['ship_string','days_supply'])
print df  

ship_string  days_supply
0  2016-01-10           28
1  2016-05-11           28
2  2016-02-23           15
3  2015-12-08           30
Run Code Online (Sandbox Code Playgroud)

我的第一个想法(有效)是使用.apply如下:

def f(x):    
    return x['ship_date'] + timedelta(days=x['days_supply'] )

df['ship_date'] = pd.to_datetime(df['ship_string'])

df['supply_ended'] = df.apply(f,axis = 1)
Run Code Online (Sandbox Code Playgroud)

这很有效,但速度非常慢.我在下面发布了我的备用解决方案作为问题的答案,但我想确认它是"最佳实践".我没有找到很多关于将时间线列添加到熊猫日期中的好线程(特别是以矢量化的方式),所以我想添加一个更友好的用户,希望它能帮助下一个可怜的灵魂尝试做这个.

fly*_*all 23

完整代码解决方案

import pandas as pd
from datetime import timedelta

df = pd.DataFrame([['2016-01-10',28],['2016-05-11',28],['2016-02-23',15],['2015-12-08',30]], 
                      columns = ['ship_string','days_supply'])

df['ship_date'] = pd.to_datetime(df['ship_string'])

df['time_added'] = pd.to_timedelta(df['days_supply'],'d')
df['supply_ended'] = df['ship_date'] + df['time_added']

print df

  ship_string  days_supply  ship_date  time_added supply_ended
0  2016-01-10           28 2016-01-10     28 days   2016-02-07
1  2016-05-11           28 2016-05-11     28 days   2016-06-08
2  2016-02-23           15 2016-02-23     15 days   2016-03-09
3  2015-12-08           30 2015-12-08     30 days   2016-01-07
Run Code Online (Sandbox Code Playgroud)

如果这不是一个好的矢量化解决方案,请在下面的评论中告诉我,我将进行编辑.

  • 这是一个很好的解决方案,如果创建新的,也许一行更好的是'df ['supply_ended'] = pd.to_datetime(df ['ship_string'])+ pd.to_timedelta(df ['days_supply'],'d')`列不是必需的。 (2认同)