根据日期列过滤和创建列 [英] Filtering and creating a column based on the date column

查看:55
本文介绍了根据日期列过滤和创建列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个示例数据如下:

I have a sample data as below:

date         Deadline
2018-08-01   
2018-08-11
2018-09-18
2018-12-08
2018-12-18

我想用代码中描述的条件 1 DL, 2 DL, 3 DL等填充截止日期列。

I want to fill in the deadline column with the conditions described in the code as "1 DL", "2 DL", "3 DL" and so on.

根据python中的date列创建一个新列。

Creating a new column based on the date column in python.

出现错误:

('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', 'occurred at index 0')

我尝试如下操作:

df['date'] = pd.to_datetime(df['date'], format = "%y-%m-%d").dt.date


def dead_line(df5):

    if((df5['date'] >= datetime.date(2018, 8, 1)) & (df['date'] <= datetime.date(2018, 9, 14))):

        return "1 DL"

    elif ((df5['date'] >= datetime.date(2018, 9, 15)) & (df5['date'] <= datetime.date(2018, 10, 17))):

        return "2 DL"

    elif ((df5['date'] >= datetime.date(2018, 10, 18)) & (df5['date'] <= datetime.date(2018, 12, 5))):

        return "3 DL"

    elif ((df5['date'] >= datetime.date(2018, 12, 6)) & (df5['date'] <= datetime.date(2019, 2, 1))):

        return "4 DL & EDL 2"


df['Deadline'] = df.apply(dead_line, axis = 1)

预期输出:

date         Deadline
2018-08-01   1 DL
2018-09-16   2 DL
2018-12-07   3 DL

等等。

推荐答案

与上述解决方案不同的解决方案。不要将datetime转换为datetime对象以进行比较,而是将其保留为datetime64,然后将过滤器功能应用于其他datetime64范围:

A different solution to the one above. Do not convert your datetime to a datetime object for comparison, instead leave it as datetime64, then apply your filter function to other datetime64 ranges:

df['date'] = pd.to_datetime(df['date'], format = "%Y-%m-%d") # leaves as datetime64[ns]

print(df['date'].dtype) #datetime64[ns]


def dead_line(x):

    if (x >= pd.to_datetime('2018-08-01')) & (x <= pd.to_datetime('2018-09-14')):
        return "1 DL"
    elif (x >= pd.to_datetime('2018-09-15')) & (x <=pd.to_datetime('2018-10-17')):
        return "2 DL"
    elif (x >= pd.to_datetime('2018-10-18')) & (x <= pd.to_datetime('2018-12-05')):
        return "3 DL"
    elif (x >=pd.to_datetime('2018-12-06')) & (x <= pd.to_datetime('2019-02-01')):
        return "4 DL & EDL 2"

df['Deadline'] = df['date'].apply(dead_line) # apply your function to column, not whole df
print(df)

输出:

        date      Deadline
0 2018-08-01          1 DL
1 2018-08-11          1 DL
2 2018-09-18          2 DL
3 2018-12-08  4 DL & EDL 2
4 2018-12-18  4 DL & EDL 2

这篇关于根据日期列过滤和创建列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆