Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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_Date_Pandas_Types_Null - Fatal编程技术网

Python 取非缺失日期的最大值

Python 取非缺失日期的最大值,python,date,pandas,types,null,Python,Date,Pandas,Types,Null,我有一个带有nan和date值的Pandas数据框(float和datetime的组合): 我想取每行的最长日期。但是,如果我取df.max(axis=1) Out[77]: 0 NaN 1 NaN 2 NaN dtype: float64 如何返回每行中的最大非空日期 您需要先转换两列,因为混合值-dates和nan。然后将nan转换为NaT df.A = pd.to_datetime(df.A) df.B = pd.to_datetime(df.B) print (df)

我有一个带有nan和date值的Pandas数据框(float和datetime的组合):

我想取每行的最长日期。但是,如果我取
df.max(axis=1)

Out[77]: 
0   NaN
1   NaN
2   NaN
dtype: float64

如何返回每行中的最大非空日期

您需要先转换两列,因为混合值-
dates
nan
。然后将
nan
转换为
NaT

df.A = pd.to_datetime(df.A)
df.B = pd.to_datetime(df.B)
print (df)
           A          B
0        NaT 2016-01-01
1 2016-01-02        NaT
2        NaT 2016-01-03

print (df.max())

A   2016-01-02
B   2016-01-03
dtype: datetime64[ns]

print (df.max(axis=1))
0   2016-01-01
1   2016-01-02
2   2016-01-03
dtype: datetime64[ns]
具有和
列表理解功能的更具动态性的解决方案

df[['A','B','C']] = pd.concat([pd.to_datetime(df[col]) for col in df[['A','B','C']]], axis=1)
print (df)
           A          B
0        NaT 2016-01-01
1 2016-01-02        NaT
2        NaT 2016-01-03
或使用
应用

df[['A','B','C']] = df[['A','B','C']].apply(pd.to_datetime)
计时

In [28]: %timeit (c(df2))
100 loops, best of 3: 4.55 ms per loop

In [29]: %timeit (b(df1))
100 loops, best of 3: 12.8 ms per loop

In [30]: %timeit (a(df))
100 loops, best of 3: 12.8 ms per loop
df = pd.DataFrame({"A": [np.nan, 
                         datetime.date(2016, 1, 2), 
                         np.nan], 
                   "B": [datetime.date(2016, 1, 1), 
                         np.nan, 
                         datetime.date(2016, 1, 3)],
                     "C": [datetime.date(2016, 1, 1), 
                     np.nan, 
                     datetime.date(2016, 1, 3)]
                   })

print (df)
#[300000 rows x 3 columns]
df = pd.concat([df]*100000).reset_index(drop=True)
df1 = df.copy()
df2 = df.copy()

def a(df):
    df[['A','B','C']] = pd.concat([pd.to_datetime(df[col]) for col in df[['A','B','C']]], axis=1)
    return df

def b(df):
    df[['A','B','C']] = df[['A','B','C']].apply(pd.to_datetime)
    return df

def c(df):
    df.A = pd.to_datetime(df.A)
    df.B = pd.to_datetime(df.B)
    df.C = pd.to_datetime(df.C)
    return df
计时代码

In [28]: %timeit (c(df2))
100 loops, best of 3: 4.55 ms per loop

In [29]: %timeit (b(df1))
100 loops, best of 3: 12.8 ms per loop

In [30]: %timeit (a(df))
100 loops, best of 3: 12.8 ms per loop
df = pd.DataFrame({"A": [np.nan, 
                         datetime.date(2016, 1, 2), 
                         np.nan], 
                   "B": [datetime.date(2016, 1, 1), 
                         np.nan, 
                         datetime.date(2016, 1, 3)],
                     "C": [datetime.date(2016, 1, 1), 
                     np.nan, 
                     datetime.date(2016, 1, 3)]
                   })

print (df)
#[300000 rows x 3 columns]
df = pd.concat([df]*100000).reset_index(drop=True)
df1 = df.copy()
df2 = df.copy()

def a(df):
    df[['A','B','C']] = pd.concat([pd.to_datetime(df[col]) for col in df[['A','B','C']]], axis=1)
    return df

def b(df):
    df[['A','B','C']] = df[['A','B','C']].apply(pd.to_datetime)
    return df

def c(df):
    df.A = pd.to_datetime(df.A)
    df.B = pd.to_datetime(df.B)
    df.C = pd.to_datetime(df.C)
    return df

您需要首先转换这两个列,因为混合了值-
日期
nan
。然后将
nan
转换为
NaT

df.A = pd.to_datetime(df.A)
df.B = pd.to_datetime(df.B)
print (df)
           A          B
0        NaT 2016-01-01
1 2016-01-02        NaT
2        NaT 2016-01-03

print (df.max())

A   2016-01-02
B   2016-01-03
dtype: datetime64[ns]

print (df.max(axis=1))
0   2016-01-01
1   2016-01-02
2   2016-01-03
dtype: datetime64[ns]
具有和
列表理解功能的更具动态性的解决方案

df[['A','B','C']] = pd.concat([pd.to_datetime(df[col]) for col in df[['A','B','C']]], axis=1)
print (df)
           A          B
0        NaT 2016-01-01
1 2016-01-02        NaT
2        NaT 2016-01-03
或使用
应用

df[['A','B','C']] = df[['A','B','C']].apply(pd.to_datetime)
计时

In [28]: %timeit (c(df2))
100 loops, best of 3: 4.55 ms per loop

In [29]: %timeit (b(df1))
100 loops, best of 3: 12.8 ms per loop

In [30]: %timeit (a(df))
100 loops, best of 3: 12.8 ms per loop
df = pd.DataFrame({"A": [np.nan, 
                         datetime.date(2016, 1, 2), 
                         np.nan], 
                   "B": [datetime.date(2016, 1, 1), 
                         np.nan, 
                         datetime.date(2016, 1, 3)],
                     "C": [datetime.date(2016, 1, 1), 
                     np.nan, 
                     datetime.date(2016, 1, 3)]
                   })

print (df)
#[300000 rows x 3 columns]
df = pd.concat([df]*100000).reset_index(drop=True)
df1 = df.copy()
df2 = df.copy()

def a(df):
    df[['A','B','C']] = pd.concat([pd.to_datetime(df[col]) for col in df[['A','B','C']]], axis=1)
    return df

def b(df):
    df[['A','B','C']] = df[['A','B','C']].apply(pd.to_datetime)
    return df

def c(df):
    df.A = pd.to_datetime(df.A)
    df.B = pd.to_datetime(df.B)
    df.C = pd.to_datetime(df.C)
    return df
计时代码

In [28]: %timeit (c(df2))
100 loops, best of 3: 4.55 ms per loop

In [29]: %timeit (b(df1))
100 loops, best of 3: 12.8 ms per loop

In [30]: %timeit (a(df))
100 loops, best of 3: 12.8 ms per loop
df = pd.DataFrame({"A": [np.nan, 
                         datetime.date(2016, 1, 2), 
                         np.nan], 
                   "B": [datetime.date(2016, 1, 1), 
                         np.nan, 
                         datetime.date(2016, 1, 3)],
                     "C": [datetime.date(2016, 1, 1), 
                     np.nan, 
                     datetime.date(2016, 1, 3)]
                   })

print (df)
#[300000 rows x 3 columns]
df = pd.concat([df]*100000).reset_index(drop=True)
df1 = df.copy()
df2 = df.copy()

def a(df):
    df[['A','B','C']] = pd.concat([pd.to_datetime(df[col]) for col in df[['A','B','C']]], axis=1)
    return df

def b(df):
    df[['A','B','C']] = df[['A','B','C']].apply(pd.to_datetime)
    return df

def c(df):
    df.A = pd.to_datetime(df.A)
    df.B = pd.to_datetime(df.B)
    df.C = pd.to_datetime(df.C)
    return df

好极了!我尝试了这个方法,但没有在每个列上应用
pd.to\u datetime
函数,所以它给了我一个错误。这是可行的,但有点烦人,我不得不在列中循环。只有3个这样做(在时间允许时接受答案),我将它设置为循环,以便它可以扩展,但我更愿意做
pd.to_datetime(df[['A','B']])
。我添加了计时,如果只有3列,最快的解决方案是将代码重复3次,或者更好的方法是使用
apply
。如果有更多的列,
concat
解决方案会更快。我仍然有一个问题。这在这个例子中起了作用,但在我的真实数据中却没有,我不知道为什么。我正在用更多的示例输出更新问题。刚刚更新。我猜这是一个日期格式的东西,因为我的真实数据上列出了小时数。顺便说一句,我并不是落选者,太好了!我尝试了这个方法,但没有在每个列上应用
pd.to\u datetime
函数,所以它给了我一个错误。这是可行的,但有点烦人,我不得不在列中循环。只有3个这样做(在时间允许时接受答案),我将它设置为循环,以便它可以扩展,但我更愿意做
pd.to_datetime(df[['A','B']])
。我添加了计时,如果只有3列,最快的解决方案是将代码重复3次,或者更好的方法是使用
apply
。如果有更多的列,
concat
解决方案会更快。我仍然有一个问题。这在这个例子中起了作用,但在我的真实数据中却没有,我不知道为什么。我正在用更多的示例输出更新问题。刚刚更新。我猜这是一个日期格式的东西,因为我的真实数据上列出了小时数。顺便说一句,我不是落选者。