熊猫日期时间操作优化

时间:2018-04-05 12:21:40

标签: pandas datetime

我想生成一个列“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

还有其他办法吗?

3 个答案:

答案 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