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