【发布时间】: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])也适用于第一行。
标签: python pandas datetime dataframe max