Pandas 实时操作优化
我想生成一个专栏“从几天到圣诞节”。我写了这个函数,但在我看来它并不优雅Pandas 实时操作优化,pandas,datetime,Pandas,Datetime,我想生成一个专栏“从几天到圣诞节”。我写了这个函数,但在我看来它并不优雅 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.d
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
def xmas(x):
如果x
还有其他方法吗?我之前的回答没有处理年终总结,下面是一个版本:
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日吗?我之前的回答没有涉及到全年,这里有一个版本可以做到这一点:
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日吗?如果日期在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
如果日期在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
如果您的输入数据仅限于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)
或定义的功能:
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
如果您的输入数据仅限于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)
或定义的功能:
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