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

时间:2016-07-13 15:24:17

标签: pandas vectorization timedelta

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

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

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

我的第一个想法(哪个有效)是使用.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)

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

1 个答案:

答案 0 :(得分:16)

完整的代码解决方案:

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

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