当前位置: 代码迷 >> python >> 带有 Agg 最小/最大日期的 Pandas Groupby
  详细解决方案

带有 Agg 最小/最大日期的 Pandas Groupby

热度:91   发布时间:2023-06-27 21:17:39.0

我试图从可能没有日期的列中获取最小/最大日期。

我尝试过诸如 ''、“NaN”、True、False、0 等...

我首先根据“+”或“-”的操作从实际日期设置“p_date”和“s_date”。

 df_td [ 'p_date' ] = np.where ( df_td.action == '+', df_td.date, ??? )
 df_td [ 's_date' ] = np.where ( df_td.action == '-', df_td.date, ??? )

所以我在这里需要 s_date 的 p_date 和 max 的最小值。

  issue      p_date      s_date
0  issue  2012-11-01            
1  issue  2013-12-09            
2  issue  2014-12-08            
3  issue              2016-01-13
4  issue  2012-11-01            
5  issue              2014-03-26
6  issue              2015-05-29
7  issue  2013-12-18            
8  issue              2016-01-13

我做了一个小组

g = df_td.groupby ( [ 'name', 'type' ], as_index = False ).agg (
     {  ...
        'p_date': 'min',
        's_date': 'max'
      } )

这给了我以下错误。

'<=' not supported between instances of 'datetime.date' and 'str'

如果我为空白指定日期,它确实有效,但这不是一个好选择。

我可以用什么来填写日期以使其正常工作?

谢谢。

在 Pandas 中, NaN被用作缺失值,并且在大多数操作中被忽略,因此使用它是正确的。 如果您仍然收到错误消息,那可能是因为您在那里有一个 datetime.date(好吧,您肯定在那里得到了它,我的意思是它可能导致了问题)。

例如,如果您的缺失值是""并且您的列数据类型是具有内部类型datetime.date object ,我会得到:

In [496]: df.groupby("issue").agg({"p_date": "min", "s_date": "max"})
[...]
TypeError: '<=' not supported between instances of 'datetime.date' and 'str'

但是如果我切换到 pandas-native 时间对象和 NaN,它会起作用:

In [500]: df["p_date"] = pd.to_datetime(df["p_date"])

In [501]: df["s_date"] = pd.to_datetime(df["s_date"])

In [502]: df
Out[502]: 
   issue     p_date     s_date
0  issue 2012-11-01        NaT
1  issue 2013-12-09        NaT
2  issue 2014-12-08        NaT
3  issue        NaT 2016-01-13
4  issue 2012-11-01        NaT
5  issue        NaT 2014-03-26
6  issue        NaT 2015-05-29
7  issue 2013-12-18        NaT
8  issue        NaT 2016-01-13

In [503]: df.groupby("issue").agg({"p_date": "min", "s_date": "max"})
Out[503]: 
          p_date     s_date
issue                      
issue 2012-11-01 2016-01-13

我对我的回答不满意,但它似乎有效。

我创建了一个地板和天花板日期。

floor = datetime.date ( 1900, 1, 1 )
ceil = datetime.date ( 2100, 1, 1 )

df_td [ 'p_date' ] = np.where ( df_td.action == '+', df_td.date, ceil )
df_td [ 's_date' ] = np.where ( df_td.action == '-', df_td.date, floor )

这样,它们将抵消需要数据对象才能工作的最小/最大聚合函数。

还是想要更合适的建议。 谢谢。

  相关解决方案