2017-07-20 4 views
-1

私のデータフレームには2つの列があります。その間に月を取るためにそれらを引くと、私は奇妙な数を得た。次に例を示します。パンダで月を正しく引く方法

test = pd.DataFrame({'reg_date': [datetime(2017,3,1), datetime(2016,9,1)], 
       'leave_date':[datetime(2017,7,1), datetime(2017,6,1)]}) 
test['diff_month'] = test.leave_date.dt.month - test.reg_date.dt.month 
test 

出力:

enter image description here

ユーザーのregister_dateは昨年であれば、私は負の数(これも間違ったとしても)を取得します。

2つのdatetime列の間の月の正しい時差を得るために、どのような操作を実行する必要がありますか?


更新:私が直面している問題の詳細を反映するように、例を少し変更しました。あまりにも速い人を投票しないでください。

私はこの問題を解決するためにやったハックは以下のとおりです。

test['real_diff'] = test.diff_month.apply(lambda x: x if x > 0 else 12+x) 

それを行うための他の方法がある場合、私は好奇心旺盛ですので、私はハックを好きではありません。

+0

b.month = 5、a.month = 12 - > 5 - 12 = -7 .. 'a.month' - ' b.month'を試してみてください – narn

+0

[Python:2ヶ月間のdatetimesの相違]の可能な複製(https://stackoverflow.com/questions/7015587/python-difference-of-two-datetimes-in-months) – perigon

+0

同じ試験ここでは:https://stackoverflow.com/questions/41199351/month-subtract-month –

答えて

1

IIUCあなたがapplyを呼び出し、@zipaが示唆されているようにrelativedeltaを使用することができます。

In[29]: 
from dateutil import relativedelta 
test['real_diff'] = test.apply(lambda row: relativedelta.relativedelta(row['leave_date'], row['reg_date']).months, axis=1) 
test 

Out[29]: 
    leave_date reg_date real_diff 
0 2017-07-01 2017-03-01   4 
1 2017-06-01 2016-09-01   9 
2

あなたはdateutilからrelativedeltaを使用することができ、あなたの結果を得るために:

import datetime 
from dateutil import relativedelta 

a = datetime.datetime(2016, 12, 1) 
b = datetime.datetime(2017, 5, 1) 

relativedelta.relativedelta(b, a).months 
#5 
+0

ありがとうzipa、私が与えた例はあまり正確ではありません。私は私の質問を更新しました。 – Cheng

関連する問題