首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas dataframe上有日期的条件

Pandas dataframe上有日期的条件
EN

Stack Overflow用户
提问于 2019-12-11 12:04:56
回答 2查看 780关注 0票数 0

我想要创建一个基于特定条件标记行的函数。

它不起作用,我认为它是由列的格式引起的。

其职能是:

代码语言:javascript
复制
tolerance=5

def pmm_m2_rag(data):

    if  data['m2'] == data['TP_M2'] and data['m6p'] + pd.to_timedelta(tolerance,unit='D') <= data['latedate']:
        return 'GREEN'


    elif data['m2']!= data['TP_M2'] and data['m6p'] + pd.to_timedelta(tolerance,unit='D') < data['latedate']:
        return 'AMBER'


    elif data['m2']!= None and data['m6p'] + pd.to_timedelta(tolerance,unit='D') > data['latedate']:
        return 'RED'

数据格式是:

代码语言:javascript
复制
                m2       TP_M2         m6p          latedate         
0       2019-11-28  2019-10-29  2020-02-21        2020-02-25       
1       2019-11-28  2019-10-29  2020-02-21        2020-02-25       
2       2019-11-28  2019-11-28  2020-02-09        2020-02-17       
3       2019-11-28  2019-11-28  2020-02-29        2020-02-17

数据类型是:

代码语言:javascript
复制
m2                  object
TP_M2               object
m6p                 object
latedate    object
dtype: object

预期产出:

代码语言:javascript
复制
                m2       TP_M2         m6p          latedate         RAG
0       2019-11-28  2019-10-29  2020-02-21        2020-02-25       AMBER
1       2019-11-28  2019-10-29  2020-02-21        2020-02-25       AMBER
2       2019-11-28  2019-11-28  2020-02-09        2020-02-17       GREEN
3       2019-11-28  2019-11-28  2020-02-29        2020-02-17         RED
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-11 13:24:10

首先,代码中的某些内容似乎是错误的。这

代码语言:javascript
复制
... unit='D') <= data['latedate'] < data['m6p'] ...

把比较链接起来绝对是错误的。

那么,在你的条件下琥珀,你的两个条款的or是相同的。这也毫无意义。

除此之外,还应该将列的数据类型转换为datetime类型。例如:

代码语言:javascript
复制
data = data.applymap(pd.to_datetime)

这取决于从数据库读取数据类型是什么。

在那之后,基本上有两个选择。您可以编写一个函数,该函数接受一行,计算值并返回颜色。然后逐行应用此函数。

另一个(更快更好的)选项是并行计算列'RAG‘。

这可以通过在上面编写的条件下使用numpy.where来实现。请注意,数据报列之间的and必须编写为&or必须编写为|

像这样的事情应该有效:

代码语言:javascript
复制
import numpy as np
def pmm_m2_rag(data):
    green_filter = (data.m2 == data.TP_M2) & \
        (data.m6p + pd.to_timedelta(tolerance,unit='D') <= data.latedate)

    amber_filter = (data.m2 != data.TP_M2) & \
        (data.m6p + pd.to_timedelta(tolerance,unit='D') < data.latedate) | \
        (data.latedate > data.m6p + pd.to_timedelta(tolerance,unit='D'))

    red_filter = (data.m2 != pd.NaT) & \
        (data.m6p + pd.to_timedelta(tolerance,unit='D') > data.latedate)

    data['RAG'] = np.where(green_filter, 'GREEN', np.where(amber_filter, 'AMBER', np.where(red_filter, 'RED', '')))

np.where的语法是

代码语言:javascript
复制
np.where(<CONDITION>, true-clause, false-clause)
票数 1
EN

Stack Overflow用户

发布于 2019-12-11 12:16:28

在进行object比较之前,可以将datetime转换为datetime的一个选项如下

代码语言:javascript
复制
from datetime import datetime
tolerance=5

def pmm_m2_rag(data):
    #m2 = datetime.strptime(data['m2'],'%Y-%m-%d')
    #m6p = datetime.strptime(data['m6p'],'%Y-%m-%d')
    #latedate = datetime.strptime(data['latedate'],'%Y-%m-%d')
    #TP_M2 = datetime.strptime(data['TP_M2'],'%Y-%m-%d')
    m2 = datetime.strptime(str(data['m2']),'%Y-%m-%d')
    m6p = datetime.strptime(str(data['m6p']),'%Y-%m-%d')
    latedate = datetime.strptime(str(data['latedate']),'%Y-%m-%d')
    TP_M2 = datetime.strptime(str(data['TP_M2']),'%Y-%m-%d')
    if  m2 == TP_M2 and m6p + pd.to_timedelta(tolerance,unit='D') <= latedate:
        return 'GREEN'


    elif m2!= TP_M2 and m6p + pd.to_timedelta(tolerance,unit='D') < latedate:
        return 'AMBER'


    elif m2!= None and m6p + pd.to_timedelta(tolerance,unit='D') > latedate:
        return 'RED'
df['RAG'] = df.apply(pmm_m2_rag, axis=1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59285458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档