Python 带Agg最小/最大日期的熊猫分组
我试图从可能没有日期的列中获取最小/最大日期 我尝试过诸如“”、“NaN”、真、假、0等东西 我首先根据“+”或“-”的动作,从实际日期开始设置“p_日期”和“s_日期”Python 带Agg最小/最大日期的熊猫分组,python,pandas,Python,Pandas,我试图从可能没有日期的列中获取最小/最大日期 我尝试过诸如“”、“NaN”、真、假、0等东西 我首先根据“+”或“-”的动作,从实际日期开始设置“p_日期”和“s_日期” 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_日期的最小值和s_日期的
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_日期的最小值和s_日期的最大值
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'
”我对我的答案不满意,但似乎有效
我创建了一个地板和天花板日期
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 )
这样,它们将抵消需要数据对象才能工作的最小/最大聚合函数
我仍然希望有一个更合适的建议。谢谢。在pandas中,NaN
被用作缺少的值,并且在大多数操作中被忽略,因此它是正确的使用方法。如果你仍然得到一个错误,可能是因为你在那里有一个datetime.date(好吧,你肯定在那里,我的意思是它可能是导致问题的原因)
例如,如果缺少的值是“”
,而列数据类型是对象
,内部类型为日期时间.日期
,则我得到:
In [496]: df.groupby("issue").agg({"p_date": "min", "s_date": "max"})
[...]
TypeError: '<=' not supported between instances of 'datetime.date' and 'str'
这是一个尚不清楚的问题。。你能发个帖子吗?你说你试过“NaN”
,但你描述它的方式让人觉得你用了一个字符串来表示这三个字母。您是否尝试了NaN
,如np.NaN
或float(“NaN”)
?是的,尝试了NaN和np.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