如何解决含NaT值的每行最大Timestamp计算全NaN问题?
问题:含NaT的时间列计算行最大值时全变为NaN
环境:Databricks 11.3(Python 3.9.5)
需求:计算每行的最新Timestamp,但当数据中出现NaT值时,max_time列全部变为NaN。测试模拟数据时,df.max(axis=1)可正常得到每行最大时间(含NaT的行也能正确计算),但应用到实际数据时,前10行无NaT时计算正常,加入第11行含NaT的记录后,整个max_time列变为NaN。
可复现代码:
y = pd.DataFrame( { 'last_a': ['2023-09-06 10:24:47.386000+00:00', '2023-09-06 11:09:52.037000+00:00', '2023-09-06 11:09:52.037000+00:00', '2023-09-06 07:27:13.691000+00:00'], 'last_b': ['2023-09-10 21:56:46.704120800+00:00', '2023-09-11 04:19:59.189798400+00:00', '2023-09-11 04:19:59.189798400+00:00', None] }, columns=['last_a', 'last_b'] ) # y = y.loc[0:2] y['last_a'] = pd.to_datetime(y['last_a'],format= '%Y-%m-%dT%H:%M:%S') y['last_b'] = pd.to_datetime(y['last_b'],format= '%Y-%m-%dT%H:%M:%S') y['last_max'] = y.max(axis=1) y
问题原因
- 格式字符串不匹配:你的
pd.to_datetime指定了format='%Y-%m-%dT%H:%M:%S',但原始时间字符串用空格分隔日期和时间(如2023-09-06 10:24:47...),而非T,这会导致转换失败,部分值被转为NaT,甚至引发列类型异常。 - 数据类型不一致:若实际数据中某列存在非datetime类型的隐式转换,出现NaT时
max(axis=1)会因类型冲突返回全NaN。 - Pandas版本差异:不同Pandas版本对
max(axis=1)处理NaT的逻辑有区别,Databricks环境中的Pandas版本可能存在此兼容性问题。
修复方案
方案1:修正时间转换格式
去掉错误的format参数让Pandas自动识别,或使用匹配的格式字符串:
# 方法A:自动识别格式(推荐,适配多种时间格式) y['last_a'] = pd.to_datetime(y['last_a']) y['last_b'] = pd.to_datetime(y['last_b']) # 方法B:精确匹配格式(针对带时区和微秒的时间) y['last_a'] = pd.to_datetime(y['last_a'], format='%Y-%m-%d %H:%M:%S.%f%z') y['last_b'] = pd.to_datetime(y['last_b'], format='%Y-%m-%d %H:%M:%S.%f%z')
方案2:用apply逐行计算最大值
绕过df.max(axis=1)的类型问题,逐行处理并忽略NaT:
y['last_max'] = y.apply(lambda row: max(row.dropna()), axis=1)
方案3:使用numpy.nanmax
利用numpy的nanmax函数自动忽略NaT/NaN,计算每行最大值:
import numpy as np y['last_max'] = np.nanmax(y, axis=1)
方案4:强制统一列类型为datetime64
先确保所有时间列类型统一,再计算最大值:
y = y.astype({'last_a': 'datetime64[ns, UTC]', 'last_b': 'datetime64[ns, UTC]'}) y['last_max'] = y.max(axis=1)
内容的提问来源于stack exchange,提问作者Dave4048
相关产品推荐
相关产品推荐

