【问题标题】:Max / Min of date column in Pandas, columns include nan valuesPandas 中日期列的最大值/最小值,列包含 nan 值
【发布时间】:2017-11-02 10:02:25
【问题描述】:

我正在尝试在 pandas 数据框中创建一个新列,其中包含来自其他两个日期列的最大(或最小)日期。但是,当这些列中的任何一个存在 NAN 时,整个 min/max 列都会变成 NAN。是什么赋予了?使用数字列时,这很好用……但是对于日期,新列都是 NAN。下面是一些示例代码来说明问题:

df = pd.DataFrame(data=[[np.nan,date(2000,11,1)], 
                        [date(2000,12,1), date(2000,9,1)],
                        [date(2000,4,1),np.nan],
                        [date(2000,12,2),np.nan]], columns=['col1','col2'])

df['col3'] = df[['col1','col2']].max(axis=1)

我知道它可以通过 loc 和 、isnull 等的组合来完成。但是如何让它与常规的 max/min 函数一起工作呢?

【问题讨论】:

    标签: python date pandas dataframe


    【解决方案1】:

    您将date 对象存储在列中,如果您转换为datetime,那么它会按预期工作:

    In[10]:
    df['col1'] = pd.to_datetime(df['col1'])
    df['col2'] = pd.to_datetime(df['col2'])
    df
    
    Out[10]: 
            col1       col2  col3
    0        NaT 2000-11-01   NaN
    1 2000-12-01 2000-09-01   NaN
    2 2000-04-01        NaT   NaN
    3 2000-12-02        NaT   NaN
    
    In[11]:
    df['col3'] = df[['col1','col2']].max(axis=1)
    df
    
    Out[11]: 
            col1       col2       col3
    0        NaT 2000-11-01 2000-11-01
    1 2000-12-01 2000-09-01 2000-12-01
    2 2000-04-01        NaT 2000-04-01
    3 2000-12-02        NaT 2000-12-02
    

    如果你只是这样做:

    df['col3'] = df['col1'].max()
    

    这会引发TypeError: '>=' not supported between instances of 'float' and 'datetime.date'

    NaN 值导致dtype 提升为float,因此NaN 被返回。如果您没有缺失值,那么它将按预期工作,如果您有缺失值,那么您应该将dtype 转换为datetime,以便将缺失值转换为NaT,以便max 正常工作

    【讨论】:

    • 谢谢 - 它确实适用于日期时间。不过,如果它也能处理日期就好了 ;-)
    • 就像我说的,如果你没有 NaN 值,它会正常工作,即使它们是 NaT 它仍然会失败
    • 我的意思是如果它用 NaN 处理日期会很好:)
    • 这更多地与不兼容的类型有关,如果你有字符串和数字的混合,那么它会以同样的方式失败
    • 多么棒的答案。我一直在使用令人困惑的 datetime.strptime,但 pandas 有一个优雅的内部选项,可以计算最大值。谢谢!
    猜你喜欢
    • 2020-06-20
    • 2019-01-20
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多