【问题标题】:Pandas max date by row?熊猫最大日期按行?
【发布时间】:2017-09-14 18:16:16
【问题描述】:

不幸的是,here 提出的问题的解决方案并没有解决这个问题。我正在使用 Python 3.6.2

数据框,df

                            date1                        date2
rec0    2017-05-25 14:02:23+00:00    2017-05-25 14:34:43+00:00
rec1                          NaT    2017-05-16 19:37:43+00:00

重现问题:

import psycopg2
import pandas as pd
Timestamp = pd.Timestamp
NaT = pd.NaT

df = pd.DataFrame({'date1': [Timestamp('2017-05-25 14:02:23'), NaT],
                   'date2': [Timestamp('2017-05-25 14:34:43'), Timestamp('2017-05-16 19:37:43')]})

tz = psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)
for col in ['date1', 'date2']:
    df[col] = pd.DatetimeIndex(df[col]).tz_localize(tz)
print(df.max(axis=1))

以上两列都使用pd.to_datetime()转换得到以下列类型:datetime64[ns, psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)]

运行df.max(axis=1) 不会出错,但肯定会提供不正确的解决方案。

输出(不正确):

rec0   NaN
rec1   NaN
dtype: float64

我的解决方法是apply df 的自定义函数,如下所示:

def get_max(x):
    test = x.dropna()
    return max(test)
df.apply(get_max,axis=1)

输出(正确):

rec0   2017-05-25 14:34:43+00:00
rec1   2017-05-16 19:37:43+00:00
dtype: datetime64[ns, psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)]

也许df.max() 不处理日期对象,而只查找浮点数(docs)。 知道为什么df.max(axis=1) 只返回NaN 吗?

【问题讨论】:

  • 你确定吗,这似乎有效stackoverflow.com/a/44304535/4764434
  • 您的所有列都是日期时间吗?
  • 另一种避免该问题的方法(对于大型 DataFrames 稍微快一些)是:df.stack().groupby(level=0).max()
  • @JohnGalt 请查看@unutbu 的编辑以重现该问题。 @TedPetrou 是的。 @unutbu,我实际上在大型数据帧上使用df.stack() 杀死jupyter 内核时遇到了问题(这可能是我使用的相当深的多索引所独有的),但正如你所说,这个解决方案只是避免了@ 987654340@。为什么@unutbu 的评论对第一个原始行有任何不同的作用呢?另请注意:max(df.iloc[0]) 也适用于第一行。
  • this solution 呢?

标签: python pandas datetime dataframe max


【解决方案1】:

经过一些测试,pandaspsycopg2.tz.FixedOffsetTimezone 似乎有问题。

如果您尝试df.max(axis=0),它将按预期工作,但正如您所指出的,df.max(axis=1) 将返回一系列NaN。 如果不使用psycopg2.tz.FixedOffsetTimezone 作为tzdf.max(axis=1) 将返回预期结果。

在这种情况下,其他操作将失败,例如df.transpose

请注意,如果您尝试df.values.max(axis=1),您将获得预期的结果。所以numpy.array 似乎能够处理这个问题。 您应该搜索 pandas Github 问题 (like this one),如果找不到修复程序,可以考虑打开一个新问题。

另一种解决方案是删除psycopg2.tz.FixedOffsetTimezone,但您可能有某些理由专门使用它。

【讨论】:

    【解决方案2】:

    在 Python 3.8 中使用 Pandas 1.0.5 我仍然得到一系列的Nans。通过将两列都转换为日期时间,然后将 skipna=True 和 numeric_only=False 添加到 max() 函数来解决该问题:

    df['1'] = pd.to_datetime(df['1'], utc=True)
    df['2'] = pd.to_datetime(df['2'], utc=True) 
    df['3'] = df[['1', '2']].max(axis=1, skipna=True, numeric_only=False)
    

    【讨论】:

      猜你喜欢
      • 2020-07-17
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 2014-06-04
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多