2016-07-13 18 views
1

私は、日付カラムとintカラムの2つのカラムを持つpandasデータフレームを持っていますが、日付カラムにintカラム(日数)を追加するだけです。私はdf.apply()を使って解決策を見つけましたが、それは私の完全なデータセットでは遅すぎました。私はベクター化された方法でこれを行うには多大な文書を見ません(私が見つけることができる最も近いものはthisでした)ので、私が見つけた解決策が最善の方法であることを確かめたかったのです。パンダ:timedeltaカラムをdatetimeカラムに追加する(ベクター化)

私の生データは、ints(日)の列としての文字列の単なる列です。

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) 

働いたが、非常に遅いです。私は質問に答えとして私の代わりの解決策を掲示しましたが、私はそれが "ベストプラクティス"であることを確認したいと思います。私はパンデーズの日付にtimedeltaの列を追加することで多くの良いスレッドを見つけることができませんでした(特にベクトル化された方法で)、私はもう少しユーザーフレンドリーなものを追加したいと思って、うまくいけば、これを行う。

答えて

3

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

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 

これは良いベクトル化ソリューションではありませんなら、私は下のコメントで知らせてくださいと私は編集します。

+0

df ['supply_ended'] = pd.to_datetime(df ['ship_string'])+ pd.to_timedelta(df ['days_supply']、 'd') '、新しい列を作成する必要はありません。 – jezrael

+0

「DateOffset」はSeriesで動作しないので、関数 'pd.to_timedelta'を見つけることができませんでした。そのソリューションを投稿していただきありがとうございます! – FlorianGD

関連する問題