Pandas 中日期列的最大值/最小值,列包含 nan 值

Posted

技术标签:

【中文标题】Pandas 中日期列的最大值/最小值,列包含 nan 值【英文标题】:Max / Min of date column in Pandas, columns include nan values 【发布时间】: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 函数一起工作呢?

【问题讨论】:

【参考方案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 有一个优雅的内部选项,可以计算最大值。谢谢!

以上是关于Pandas 中日期列的最大值/最小值,列包含 nan 值的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas、Python 中查找具有相同第一列的所有行的最小值、最大值、平均值

Pandas Dataframe groupby 聚合函数和动态列的最大值和最小值之间的差异

如何在不创建临时列的情况下从 pandas 数据框列计算最小值?

PostgreSQL - 如何在单个查询中获取列的最小值和最大值以及与它们关联的行?

pandas 选择每列的最小值和最大值并创建一个新的数据框

用于创建具有数据框中每个日期的最小值和最大值的表的函数