Я пытаюсь получить даты 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'
если я составляю дату для пустого пространства, это действительно работает, но это не отличный вариант.
Что я могу заполнить, чтобы заставить его работать?
Благодарю.
В 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
Я не доволен своим ответом, но, похоже, это работает.
Я создал пол и потолок.
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, которая требует, чтобы объект данных работал.
все же хотелось бы получить более подходящее предложение. Благодарю.
"NaN"
, но то, как вы описываете это, создает впечатление, что вы использовали строку с этими тремя буквами. Вы пробовалиNaN
, как вnp.nan
илиfloat("nan")
?