如何检查pandas数据框列中的年份是否为leap年-Python

时间:2018-08-23 03:16:45

标签: python pandas datetime leap-year

我有一个看起来像这样的数据集:

        DOB    DOB_year
0      1964-01-06  1964
1      1984-01-13  1984
2      1992-01-20  1992
3      1972-01-27  1972
4      2001-02-03  2001
5      2011-02-10  2011
6      1950-02-17  1950
7      1968-02-24  1968

    [318495 rows x 2 columns]

我想要一个输出,例如:

             DOB       DOB_year      is_leap
    0      1964-01-06  1964           TRUE
    1      1983-01-13  1984           FALSE
    2      1992-01-20  1992           TRUE
    3      1972-01-27  1972           TRUE
    4      2001-02-03  2001           FALSE
    5      2011-02-10  2011           FALSE
    6      1950-02-17  1950           FALSE
    7      1968-02-24  1968           TRUE

下面是代码:

def is_leapCheck(s):
return (s.dt.year % 4 == 0) & ((s.dt.year % 100 != 0) | (s.dt.year % 400 == 0)) & (s.dt.month == 2) & (s.dt.day == 29)

dob_df['is_leap']=is_leapCheck(pd.to_datetime(dob_df['year']))

代码的输出将所有the_leap值都设置为FALSE,而没有TRUE值。我不知道我在哪里出错。任何帮助表示赞赏

2 个答案:

答案 0 :(得分:1)

您可以使用calendar模块,如以下(玩具)示例所示:

import calendar
import pandas as pd


frame = pd.DataFrame(data=[2012], columns=['year'])
frame['is_leap'] = frame['year'].apply(lambda e: calendar.isleap(e))
print(frame)

输出

   year  is_leap
0  2012     True

答案 1 :(得分:1)

您的情况略有下降,但这是一种使用语言不可知的方法来确定一年是否为a年的解决方案:

condition = (df.DOB.dt.year.mod(4).eq(0) 
    & (df.DOB.dt.year.mod(100).ne(0) | df.DOB.dt.year.mod(400).eq(0))
)

df.assign(isleap=np.where(condition, 'TRUE', 'FALSE'))

         DOB  DOB_year isleap
0 1964-01-06      1964   TRUE
1 1984-01-13      1984   TRUE
2 1992-01-20      1992   TRUE
3 1972-01-27      1972   TRUE
4 2001-02-03      2001  FALSE
5 2011-02-10      2011  FALSE
6 1950-02-17      1950  FALSE
7 1968-02-24      1968   TRUE