从列中找到最近的将来日期

时间:2019-01-21 15:06:35

标签: python pandas

请从以下四列中为每个行项目查找从今天开始的下一个日期。我已经被卡住了一段时间了。

           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

2 个答案:

答案 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在该单元格中查找原始日期是不言自明的。