Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果要比较日期列,请检查是否为空,有条件><;=逻辑,返回值_Python_Pandas - Fatal编程技术网

Python 如果要比较日期列,请检查是否为空,有条件><;=逻辑,返回值

Python 如果要比较日期列,请检查是否为空,有条件><;=逻辑,返回值,python,pandas,Python,Pandas,使用Python3熊猫,我试图计算结果。我不断得到布尔值不明确的错误。我是否需要首先测试我比较的每个日期列都不是空的,以避免出现错误?最终结果应该是: #check if D3_UNTIL is not empty if df.RUNNING_DATE.isna()==False: if df.D3_UNTIL.isna()==False: if.RUNNING_DATE >= df.D3_UNTIL: df.RESULT = df.DVAL

使用Python3熊猫,我试图计算结果。我不断得到布尔值不明确的错误。我是否需要首先测试我比较的每个日期列都不是空的,以避免出现错误?最终结果应该是:

#check if D3_UNTIL is not empty
if df.RUNNING_DATE.isna()==False:
    if df.D3_UNTIL.isna()==False:
        if.RUNNING_DATE >= df.D3_UNTIL:
            df.RESULT = df.DVAL3
        elif (df.RUNNING_DATE >= df.D2_UNTIL & df.RUNNING_DATE < df.D3_UNTIL):
            df.RESULT = df.DVAL2    
        elif (df.RUNNING_DATE >= df.D1_UNTIL & df.RUNNING_DATE < df.D2_UNTIL):
            df.RESULT = df.DVAL1
        else None
#check if D2.UNTIL is not empty
    elif df.D2_UNTIL.isna()==False:
        if.RUNNING_DATE >= df.D2_UNTIL:
            df.RESULT = df.DVAL2
        elif (df.RUNNING_DATE >= df.D1_UNTIL & df.RUNNING_DATE < df.D2_UNTIL):
            df.RESULT = df.DVAL1    
        else None
#check if D1.UNTIL is not empty    
    elif df.D1_UNTIL.isna()==False:
        if.RUNNING_DATE >= df.D1_UNTIL:
            df.RESULT = df.DVAL1
        else None
else None



RUNNING_DATE  D1_UNTIL  DVAL1  D2_UNTIL  DVAL2  D3_UNTIL  DVAL3  RESULT
1/1/2018      1/1/2018  10                                       10             
1/2/2018                                
1/3/2018      1/1/2018                          
1/4/2018      1/1/2018  10     1/3/2018  15             
1/5/2018      1/1/2018  10     1/3/2018  20     1/31/2018 100    20 
1/6/2018      1/1/2018  10               999                
1/7/2018      1/1/2018  10     1/4/2018  25     1/6/2018  300    300    
#检查D3_UNTIL是否为空
如果df.RUNNING_DATE.isna()==False:
如果df.D3_UNTIL.isna()==False:
如果.RUNNING_DATE>=df.D3_直到:
df.RESULT=df.DVAL3
elif(df.RUNNING_DATE>=df.D2_UNTIL&df.RUNNING_DATE=df.D1_UNTIL&df.RUNNING_DATE=df.D2_,则直到:
df.RESULT=df.DVAL2
elif(df.RUNNING_DATE>=df.D1_UNTIL&df.RUNNING_DATE=df.D1_直到:
df.RESULT=df.DVAL1
没有别的
没有别的
运行日期D1直到DVAL1 D2直到DVAL2 D3直到DVAL3结果
1/1/2018      1/1/2018  10                                       10             
1/2/2018                                
1/3/2018      1/1/2018                          
1/4/2018      1/1/2018  10     1/3/2018  15             
1/5/2018      1/1/2018  10     1/3/2018  20     1/31/2018 100    20 
1/6/2018      1/1/2018  10               999                
1/7/2018      1/1/2018  10     1/4/2018  25     1/6/2018  300    300    

对于if-else语句,您可以使用
np。选择
来实现您的逻辑。另外,检查
df.RUNNING_DATE.isna()==False也是多余的;只需使用
df.RUNNING\u DATE.notnull()

此外,这里的逻辑可以大大简化

  • 任何
    =
    =
    =
    顺序
代码 输出: (我在末尾添加了额外的行以说明逻辑)


对于if-else语句,您可以使用
np。选择
来实现您的逻辑。另外,检查
df.RUNNING_DATE.isna()==False也是多余的;只需使用
df.RUNNING\u DATE.notnull()

此外,这里的逻辑可以大大简化

  • 任何
    =
    =
    =
    顺序
代码 输出: (我在末尾添加了额外的行以说明逻辑)


您能否运行
print(df.head(5).to_dict())
并将输出粘贴到问题中的某个位置,以便轻松复制数据?模糊错误的本质是这样的。你有一系列的数据,有些是真的,有些是假的。如果s==True,您应该返回什么?有些数据是真的,有些数据是假的。解决这个问题的一种方法是(s==True).any()或(s==True).all(),因此您可以清楚地定义,如果任何值为True,则返回True;如果s中的所有值都为True,则返回True。因此,示例代码df.RUNNING_DATE.isna()==False中的第2行,那么,如果df.RUNNING_DATE中的一些值为null,而另一些值则不为,那么if语句是不明确的。您的结果与您的逻辑不一致。第一行应该分配给
DVAL1
,2018年6月1日
1的行也应该分配给
DVAL1
@ALollz是的,好捕获。我正在输入,但忘了包含它。你能运行
print(df.head(5).to_dict())
并将输出粘贴到问题的某个地方,以便轻松复制数据吗?模糊错误的本质是这样的。你有一系列的数据,有些是真的,有些是假的。如果s==True,您应该返回什么?有些数据是真的,有些数据是假的。解决这个问题的一种方法是(s==True).any()或(s==True).all(),因此您可以清楚地定义,如果任何值为True,则返回True;如果s中的所有值都为True,则返回True。因此,示例代码df.RUNNING_DATE.isna()==False中的第2行,那么,如果df.RUNNING_DATE中的一些值为null,而另一些值则不为,那么if语句是不明确的。您的结果与您的逻辑不一致。第一行应该分配给
DVAL1
,2018年6月1日
1的行也应该分配给
DVAL1
@ALollz是的,好捕获。我正在键入它,但忘了包含它。为了我的充分理解,在conds list变量和choices list变量中,np.select是否会对列表中的元素位置进行求值(即,如果cond[0],那么choices[0],elif cond[1],那么choices[1],....@Chris,是的,完全正确。从文档
中可以看出,当满足多个条件时,将使用condlist中遇到的第一个条件,这就是为什么我们能够安全地检查条件是否大于该特定顺序。如果没有一个条件得到满足(当
RUNNING_DATE
为空,或者当RUNNING DATE小于所有其他字段时,它将使用默认值,我们将其设置为
None
。非常感谢!这是一个很大的帮助,比我的方法优雅得多。@Chris很高兴它起到了帮助作用!你采取了一种更具代表性的逐行方法使用pandas,您可以将这些计算作为作用于整组列的计算,这就是
np。select
的作用。为了我的充分理解,在conds list变量和choices list变量中,np.select是否对列表中的每个元素位置进行评估(即,如果cond[0],则choices[0],elif cond[1]然后选择[1],..@Chris,是的,完全正确。从文档
中,当满足多个条件时,使用condlist中遇到的第一个条件,这就是为什么我们可以安全地检查条件是否大于该特定顺序。如果不满足任何条件(当
RUNNING\u DATE
为空时,或当RUNNING DATE为空时,即为这种情况。)
import pandas as pd
import numpy a np

# Ensure Datetime
#df['RUNNING_DATE'] = pd.to_datetime(df.RUNNING_DATE, errors='coerce')
#df['D1_UNTIL'] = pd.to_datetime(df.D1_UNTIL, errors='coerce')
#df['D2_UNTIL'] = pd.to_datetime(df.D2_UNTIL, errors='coerce')
#df['D3_UNTIL'] = pd.to_datetime(df.D3_UNTIL, errors='coerce')

conds = [
    df.RUNNING_DATE >= df.D3_UNTIL,
    df.RUNNING_DATE >= df.D2_UNTIL,
    df.RUNNING_DATE >= df.D1_UNTIL]

choices = [
    df.DVAL3,
    df.DVAL2,
    df.DVAL1]

df['RESULT'] = np.select(conds, choices, default=None)
  RUNNING_DATE   D1_UNTIL  DVAL1   D2_UNTIL  DVAL2   D3_UNTIL  DVAL3 RESULT
0   2018-01-01 2018-01-01   10.0        NaT    NaN        NaT    NaN     10
1   2018-01-02        NaT    NaN        NaT    NaN        NaT    NaN   None
2   2018-01-03 2018-01-01    NaN        NaT    NaN        NaT    NaN    NaN
3   2018-01-04 2018-01-01   10.0 2018-01-03   15.0        NaT    NaN     15
4   2018-01-05 2018-01-01   10.0 2018-01-03   20.0 2018-01-31  100.0     20
5   2018-01-06 2018-01-01   10.0        NaT  999.0        NaT    NaN     10
6   2018-01-07 2018-01-01   10.0 2018-01-04   25.0 2018-01-06  300.0    300
7          NaT        NaT    NaN        NaT    NaN        NaT    NaN   None
8          NaT        NaT    NaN 2018-01-01   24.0        NaT    NaN   None