web-dev-qa-db-ja.com

パンダ:timedelta列をdatetime列に追加(ベクトル化)

pandasデータフレームに日付列とint列の2つの列があり、日付列にint列(日数)を追加したいだけです。解決策が見つかりましたdf.apply()を使用していますが、これは私のデータセット全体では遅すぎました。これをベクトル化した方法で実行することに関する大量のドキュメントは表示されません(私が見つけた最も近いものは this でした)、それで、私が見つけた解決策が前進するための最良の方法であることを確認したかったのです。

私の生データは、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

私の最初の考え(うまくいった)は、次のように.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)

それはうまくいったが、非常に遅い。質問への回答として以下の代替ソリューションを投稿しましたが、それが「ベストプラクティス」であることを確認したいのですが。 pandas(特にベクトル化された方法で))の日付にtimedelta列を追加するのに適したスレッドを多く見つけることができなかったので、もう少しユーザーフレンドリーでうまくいけば1つ追加すると思いますそれはこれをやろうとしている次の貧しい魂を助けるでしょう。

14
flyingmeatball

完全なコードソリューション:

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

これが良いベクトル化された解決策ではない場合は、以下のコメントでお知らせください。編集します。

24
flyingmeatball