我想生成一个列“days_to_christmas”。我写了这个函数,但在我看来并不优雅。
def xmas(x):
if x < pd.datetime(2015,12,21):
return (pd.datetime(2015,12,21) - x).days
elif x < pd.datetime(2016,12,21):
return (pd.datetime(2016,12,21) - x).days
elif x < pd.datetime(2017,12,21):
return (pd.datetime(2017,12,21) - x).days
elif x < pd.datetime(2018,12,21):
return (pd.datetime(2018,12,21) - x).days
else:
return (pd.datetime(2019,12,21) - x).days
还有其他办法吗?
答案 0 :(得分:2)
我之前的回答没有处理年份回合,这是一个版本:
def days_to_day_month(date, month, day):
if (date.month == month and date.day > day):
return (pd.datetime(date.year+1, month, day)-date).days
else:
return (pd.datetime(date.year, month, day)-date).days
计算圣诞节的天数,如下所示:
days_to_day_month(date, 12, 21)
或围绕它构建默认值:
days_to_christmas(date):
return days_to_day_month(date, 12, 21)
然后你可以打电话:
days_to_christmas(date)
我唯一得不到的是:12月24日不是圣诞节而不是21日?
答案 1 :(得分:1)
如果日期是在12月21日之后,则可以获得直到明年圣诞节的其他日子今年的圣诞节
def days_to_christmas(d):
next_christmas = date(d.year+1, 12, 21) \
if d.month == 12 and d.day >= 21 else date(d.year, 12, 21)
return (next_christmas - d).days
答案 2 :(得分:1)
如果您的输入数据仅限于2015年至2019年,那么您可以使用此声明。
np.random.seed(123)
s = pd.DataFrame({'date':np.random.choice(pd.date_range('2015-01-01','2019-12-31',freq='D'),10)})
使用lambda函数:
s['days_to_christmas'] = s['date'].apply(lambda x: (pd.to_datetime(str(x.year)+'-12-21')-x).days)
或定义的函数:
def xmas(x):
return (pd.to_datetime(str(x.year)+'-12-21')-x).days
s['days_to_christmas'] = s['date'].apply(xmas)
输出:
date days_to_christmas
0 2015-05-27 208
1 2016-04-29 236
2 2018-07-19 155
3 2017-09-30 82
4 2016-02-16 309
5 2019-11-25 26
6 2015-06-08 196
7 2018-04-19 246
8 2019-05-26 209
9 2018-10-21 61