Pandas Groupby с Agg Мин / Макс дата

1

Я пытаюсь получить даты min/max из столбцов, у которых может не быть даты.

Я пробовал такие вещи, как "", "NaN", "Правда", "Ложь", "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, ??? )

Поэтому мне нужен минус p_date & max s_date.

  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'

если я составляю дату для пустого пространства, это действительно работает, но это не отличный вариант.

Что я могу заполнить, чтобы заставить его работать?

Благодарю.

  • 3
    Это вопрос неясен .. вы можете опубликовать минимальный воспроизводимый пример ?
  • 0
    Вы говорите, что пробовали "NaN" , но то, как вы описываете это, создает впечатление, что вы использовали строку с этими тремя буквами. Вы пробовали NaN , как в np.nan или float("nan") ?
Показать ещё 1 комментарий
Теги:
pandas

2 ответа

0
Лучший ответ

В pandas NaN используется как недостающее значение, и для большинства операций игнорируется, поэтому он подходит для использования. Если вы все еще получаете ошибку, возможно, потому, что у вас есть datetime.date (ну, вы определенно получили это там, я имею в виду, что это, вероятно, вызывает проблемы).

Например, если ваши отсутствующие значения "" а ваши dtypes столбца являются object с внутренними типами datetime.date, я получаю:

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

но если я переключусь на pandas-native time objects и NaNs, он работает:

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
  • 0
    интересно, спасибо!
0

Я не доволен своим ответом, но, похоже, это работает.

Я создал пол и потолок.

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 )

Таким образом, они будут компенсировать функцию агрегации min/max, которая требует, чтобы объект данных работал.

все же хотелось бы получить более подходящее предложение. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню