2017-03-01 34 views
2

日付を含む2つの列を持つpandasデータフレームがあります。私は、2つの日付の間の年数を知り、うるう年を考慮したい。python/pandas日付までの年数を調べる

サンプルデータ:

date_end date_start 
2010-02-09 1933-03-03 
2010-03-19 1924-04-08 
2010-04-19 1924-04-08 
2010-09-06 1924-04-08 
2010-09-24 1924-04-08 
2010-01-09 1933-04-29 
2010-02-26 1933-04-29 
2010-01-31 1953-06-10 
2010-07-07 1928-11-14 
2010-12-01 1974-11-17 

date_startdate_endは、 "日時" DTYPEです。私は2つの日付の間の年数である新しい列を求めています。 2つの日付(df['diff'] = df.date_end - df.date_start)の間の日数を取得するのは簡単ですが、問題が発生します。なぜなら、与えられた日数を経過した年数は、うるう年のために日がいつ起こったかに依存します。

これは、人の年齢に似ています。私は同様の質問にいくつかのソリューションを適用しようとしましたが、多くの質問は2つの日付の間の日数または週数についてです。私はすでにうるう年を考慮せずに年数を取得する方法をすでに持っていますが、私はそれよりも正確でありたいです。あなたは365日として年を定義したいと仮定すると、

+0

は1年間です。 2016年2月28日〜2017年2月28日はどうですか? 2016年2月29日〜2017年2月28日? 2016年2月29日〜2017年1月3日? 2015年3月1日〜2016年2月29日? – Boud

+0

** 2016年2月28日〜2017年2月28日:** 1年1日 ** 2016年2月28日〜2017年2月28日:** 1年間? ** 2016年2月29日〜2017年3月:** 1年1日? ** 2015年3月1日〜2016年2月29日** ** 1年? 年が絶対的な測定値ではないように思われるので、私はかなり混乱しています。その長さは、うるう年かどうかによって決まります。だからこそ私はパンダ(または他のパッケージ)が私のためにこれを適切に処理できることを願っています。 – user139188

答えて

2

、あなたはこれを行うことができます:あなたが見ることができるように

>> df 
    date_end date_start is_leapyear 
0 2016-02-28 2015-02-28   0 
1 2017-02-28 2016-02-28   1 
2 2018-02-28 2017-02-28   0 

>> df['diff_in_days'] = df['date_end'] - df['date_start'] 
>> df['diff_in_years'] = df["diff_in_days"]/timedelta(days=365) 
>> print df[["date_end", "date_start", "diff_in_years"]] 

>> df 
    date_end date_start is_leapyear diff_in_years 
0 2016-02-28 2015-02-28   0  1.00000 
1 2017-02-28 2016-02-28   1  1.00274 
2 2018-02-28 2017-02-28   0  1.00000 

は、余分な日(2月29日)との年に、より多くの時間が日付の間に経過しました。あなたの場合、これは次のようになるでしょう:

date_end date_start diff_in_years 
0 2010-02-09 1933-03-03  76.991781 
1 2010-03-19 1924-04-08  86.002740 
2 2010-04-19 1924-04-08  86.087671 
3 2010-09-06 1924-04-08  86.471233 
4 2010-09-24 1924-04-08  86.520548 
5 2010-01-09 1933-04-29  76.750685 
6 2010-02-26 1933-04-29  76.882192 
7 2010-01-31 1953-06-10  56.682192 
8 2010-07-07 1928-11-14  81.698630 
9 2010-12-01 1974-11-17  36.063014 

一方、あなたはちょうど年の差をしたい場合。すなわち、日付が発生した年を差し引く(年が何日起こったのかを問わず)。そして、あなたがこれを行うことができます:あなたのケースでは

df['date_end_year'] = df.date_end.apply(lambda x: x.year) 
df['date_start_year'] = df.date_start.apply(lambda x: x.year) 
df['diff_in_years'] = df['date_end_year'] - df['date_start_year'] 
print df[["date_end", "date_start", "diff_in_years"]] 

    date_end date_start diff_in_years 
0 2016-02-28 2015-02-28    1 
1 2017-02-28 2016-02-28    1 
2 2018-02-28 2017-02-28    1 

をこれは次のようになります。1月1日 - 2016年から1月1日 - 2017年までのように

date_end date_start diff_in_years 
0 2010-02-09 1933-03-03    77 
1 2010-03-19 1924-04-08    86 
2 2010-04-19 1924-04-08    86 
3 2010-09-06 1924-04-08    86 
4 2010-09-24 1924-04-08    86 
5 2010-01-09 1933-04-29    77 
6 2010-02-26 1933-04-29    77 
7 2010-01-31 1953-06-10    57 
8 2010-07-07 1928-11-14    82 
9 2010-12-01 1974-11-17    36 
+0

おかげさまで!確かに、 'is_leapyear'は実証的な目的のためであった、正しい?また、「diff_in_days」を365で割るか、365.25で割るべきですか? – user139188

+0

timedeltaはどのモジュールですか? – user139188

+0

datetime import timedeltaからですが、is_leapyearは説明目的のためだけです – dataflow

関連する問題