我有以下代码-
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