Pandas: 将 timedelta 列添加到 datetime 列(矢量化)
Pandas: add timedelta column to datetime column (vectorized)
我有一个包含两列的 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)
有效,但速度极慢。我已经在下面发布了我的替代解决方案作为问题的答案,但我想确认它是 "best practice"。我找不到很多关于将 timedelta 列添加到 pandas 中的日期的好线程(尤其是在矢量化方式中),所以我想我会添加一个对用户更友好的线程,希望它能帮助下一个可怜的灵魂试图这样做。
完整代码解决方案:
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
如果这不是一个好的矢量化解决方案,请在下面的评论中告诉我,我会进行编辑。
解决这些问题的另一种方法:我们可以将时间戳更改为秒,加上或减去您想要的数字,然后再次更改为时间戳。对于一些复杂的时间操作,这个方法会有用。
df["ship_string"]=pd.to_datetime(df["ship_string"])
ls_temp = (df["ship_string"] - pd.Timestamp("1970-01-01")) // pd.Timedelta("1s")
df["supply_ended"] = pd.to_datetime(ls_temp+df["days_supply"]*(24*3600), unit="s")
我有一个包含两列的 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)
有效,但速度极慢。我已经在下面发布了我的替代解决方案作为问题的答案,但我想确认它是 "best practice"。我找不到很多关于将 timedelta 列添加到 pandas 中的日期的好线程(尤其是在矢量化方式中),所以我想我会添加一个对用户更友好的线程,希望它能帮助下一个可怜的灵魂试图这样做。
完整代码解决方案:
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
如果这不是一个好的矢量化解决方案,请在下面的评论中告诉我,我会进行编辑。
解决这些问题的另一种方法:我们可以将时间戳更改为秒,加上或减去您想要的数字,然后再次更改为时间戳。对于一些复杂的时间操作,这个方法会有用。
df["ship_string"]=pd.to_datetime(df["ship_string"])
ls_temp = (df["ship_string"] - pd.Timestamp("1970-01-01")) // pd.Timedelta("1s")
df["supply_ended"] = pd.to_datetime(ls_temp+df["days_supply"]*(24*3600), unit="s")