python / pandas 查找两个日期之间的年数

use*_*188 5 python datetime date pandas

我有一个包含日期的两列的熊猫数据框。我想知道两个日期之间的年数,同时考虑闰年。

理想的解决方案不会假设一年总是有一定的天数。因为年并不总是有 365 天。

样本数据:

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
Run Code Online (Sandbox Code Playgroud)

date_start并且date_end是“日期时间”dtype。我想要一个新列,表示两个日期之间的年数。获取两个日期 ( df['diff'] = df.date_end - df.date_start)之间的天数很简单,但后来我遇到了麻烦,因为给定天数过去的年数取决于日期发生的“时间”,因为闰年​​。

这类似于一个人的年龄。我已经尝试针对类似问题采用多种解决方案,但许多问题都与两个日期之间的天数或周数有关。我已经有一种方法可以在不考虑闰年的情况下获得年数,但我想比这更正确。

dat*_*low 10

假设您想将一年定义为 365 天,那么您可以这样做:

>> 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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在有额外天数的年份(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
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您只想要年份差异。即减去日期发生的年份(无论该日期发生在当年的什么时候)。然后你可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

在你的情况下,这将是:

    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
Run Code Online (Sandbox Code Playgroud)