2017-10-11 15 views
0

月を適切に計算するのに問題があります。私がこれまでに持っていたことは、出力と同様に以下にあります。 月の大半は正しく計算されますが、一部の計算では計算されません。私はそれが私を悩ませているので、これを理解する必要があります。 アイデアをいただければ幸いです。パンダとnumpyで月を計算する

import pandas as pd 
import numpy as np 
df = pd.DataFrame({ 
    'StartDate' : ['2017-06-19', '2017-10-01', '2017-09-29', '2017-08-01', '2017-08-01'], 
    'EndDate' : ['2018-06-18', '2017-12-31', '2018-09-30', '2018-07-31', '2017-09-30'], 
    'ExpectedMonths' : [13, 3, 13, 12, 2] 
}) 

df['StartDate'] = pd.to_datetime(df['StartDate'], format='%Y-%m-%d') 
df['EndDate'] = pd.to_datetime(df['EndDate'], format='%Y-%m-%d') 
df['calculatedMonths'] = (df["EndDate"] - df["StartDate"])/np.timedelta64(1, 'M') 
df['ceilMonths'] = df['calculatedMonths'].apply(np.ceil) 

これまで出力:あなたが見ることができるように 、最初の行は13でなければなりませんが、私は結果で12を見ています。 5月-6月は12なると13

 EndDate  ExpectedMonths  StartDate calculatedMonths ceilMonths 
0  2018-06-18 13     2017-06-19 11.959178   12.0 
1  2017-12-31 3     2017-10-01 2.989794   3.0 
2  2018-09-30 13     2017-09-29 12.024888   13.0 
3  2018-07-31 12     2017-08-01 11.959178   12.0 
4  2017-09-30 2     2017-08-01 1.971293   2.0 

私が期待される出力と計算ヶ月が一致してもらうために調整するには何が必要ですかなければなりません、別の月(6月)を追加する必要がありますか?

答えて

2

IIUC:

In [117]: df["EndDate"].dt.to_period('M') - df["StartDate"].dt.to_period('M') 
Out[117]: 
0 12 
1  2 
2 12 
3 11 
4  1 
dtype: object 
1

6月18日に6月の19日から行くには、6月に6月から天井が12

である理由であるわずか12ヶ月の下であなたを得るためにされて起こっています12ヶ月ではない13 ... 1年です。 インデックス0と3の予想月数は12です。

ここにいくつかの修正されたコードがあります。

import pandas as pd 
import numpy as np 
df = pd.DataFrame({ 
    'StartDate' : ['2017-06-19', '2017-10-01', '2017-09-29', '2017-08-01', '2017-08-01'], 
    'EndDate' : ['2018-06-18', '2017-12-31', '2018-09-30', '2018-07-31', '2017-09-30'], 
    'ExpectedMonths' : [12, 3, 12, 12, 2] 
}) 

df['StartDate'] = pd.to_datetime(df['StartDate'], format='%Y-%m-%d') 
df['EndDate'] = pd.to_datetime(df['EndDate'], format='%Y-%m-%d') 
df['calculatedMonths'] = (df["EndDate"] - df["StartDate"])/np.timedelta64(1, 'M') 
df['roundedMonths'] = round(df['calculatedMonths']) 

print(df)