我有一个看起来像这样的数据集:
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值。我不知道我在哪里出错。任何帮助表示赞赏
答案 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