从pandas数据帧中获取datetime.date的最小值/最大值,忽略NaT



我有以下代码-

from datetime import datetime
import pandas as pd
data_dict = {"DATE_1" : [datetime.strptime("01/01/8888", "%m/%d/%Y").date()]*5,
"DATE_2" : [datetime.strptime("01/01/1000", "%m/%d/%Y").date()]*5}
df2 = pd.DataFrame(data_dict)
df2["NO_DATE"] = pd.NaT
df2

当我运行以下程序时,我得到了一个有5行的系列-01/01/1000作为输出

df2[["DATE_1", "DATE_2"]].min(axis=1, skipna=True)

但是当我运行这个时,由于NO_DATE列,我得到了所有的NaN作为输出

df2[["DATE_1", "DATE_2", "NO_DATE"]].min(axis=1, skipna=True)

有没有一个好方法可以在忽略pd.NaT的情况下获得最小日期?如果任何一行具有pd.NaT,则忽略该列并获取最小非null值。

请注意,使用的日期超出了datetime64[ns]的范围

本例中的问题是后台强制,因为pd.NaT使panda想要强制进行浮点比较,但您的日期时间值都超出了datetime64[ns]的范围,因此它们只能由pd.NaT表示。

一种解决方案是stack,这样就可以删除丢失的值,只剩下datetime对象。然后可以对原始索引进行groupby+min,以逐行获取最小值/最大值。向后分配将与原始行"索引"对齐。如果一行完全缺失,则该值变为NaN

# Make an entire row NaT for illustration
df2.iloc[1, :] = pd.NaT
df2['min'] = df2.stack().dropna().groupby(level=0).min()

print(df2)
#       DATE_1      DATE_2 NO_DATE         min
#0  8888-01-01  1000-01-01     NaT  1000-01-01
#1         NaT         NaT     NaT         NaN
#2  8888-01-01  1000-01-01     NaT  1000-01-01
#3  8888-01-01  1000-01-01     NaT  1000-01-01
#4  8888-01-01  1000-01-01     NaT  1000-01-01

最新更新