请从以下四列中为每个行项目查找从今天开始的下一个日期。我已经被卡住了一段时间了。
InDate1 InDate2 InDate3 InDate4
284075 2018-03-07 2018-09-07 2019-03-07 2019-01-21
334627 2018-03-07 2018-09-07 2019-03-07 2019-09-07
答案 0 :(得分:0)
请检查此内容。
将第一批日期值放入行中,以便我们可以应用最小和今天的比较。
df1 = df.stack().reset_index()
df1.columns = ["ID", "Field", "Date"]
然后用今天过滤数据并找出最短日期。
df1 = df1[df1.Date > datetime.datetime.now()].groupby("ID").agg("min").reset_index()
然后枢轴生成日期,在它之前,只需分配一个用于确定的静态值作为单列标题即可,而不是IntDate1..etc。
df1.Field = "MinValue"
df1 = df1.pivot(index="ID", columns="Field", values="Date").reset_index()
最后将最小日期值数据框与原始数据框合并。
df = df.merge(df1, how="left")
答案 1 :(得分:0)
对于每一行,找到保存最近日期的列:
import pandas as pd
s = (df.apply(pd.to_datetime) # If not already datetime
.apply(lambda x: (x - pd.to_datetime('today')).dt.total_seconds())
.where(lambda x: x.gt(0)).idxmin(1))
print(s)
#284075 InDate3
#334627 InDate3
#dtype: object
然后查找每一行的值:
df.lookup(s.index, s)
#array(['2019-03-07', '2019-03-07'], dtype=object)
要详细说明此功能,可以分别查看每个部分的功能
首先,确定您的DataFrame
与今天之间的时间差。 .apply(pd.to_datetime)
将所有内容转换为datetime
,以便可以对日期进行算术运算,第二个应用将查找时差,将其从timedelta
转换为秒数,这仅仅是浮动。 (不确定为什么简单的df - pd.to_datetime('today')
不太起作用,需要应用)
s = (df.apply(pd.to_datetime) # If not already datetime
.apply(lambda x: (x - pd.to_datetime('today')).dt.total_seconds()))
print(s)
InDate1 InDate2 InDate3 InDate4
284075 -2.769565e+07 -1.179805e+07 3.840347e+06 -4.765262e+04
334627 -2.769565e+07 -1.179805e+07 3.840347e+06 1.973795e+07
将来的日期将具有正时差,因此我使用.where
仅查找具有正值的单元格,将其他所有内容替换为NaN
s = s.where(lambda x: x.gt(0))
# Could use s.where(s.gt(0)) here since `s` is defined
print(s)
InDate1 InDate2 InDate3 InDate4
284075 NaN NaN 3.840347e+06 NaN
334627 NaN NaN 3.840347e+06 1.973795e+07
然后.idxmin(axis=1)
将返回每行(轴= 1)的最小值(忽略最近的日期)的列(忽略NaN
)。
s.idxmin(1)
print(s)
284075 InDate3
334627 InDate3
dtype: object
最后,DataFrame.lookup
在该单元格中查找原始日期是不言自明的。