首页 > 解决方案 > 从连续的日期时间变量生成分类变量

问题描述

我正在尝试从连续的日期时间变量中创建一个分类变量。

基本上如果他们在 15 到 25 之间,那么 Age_category = 1,如果他们在 25 到 35 之间,那么 Age_category = 2。

我已经知道了,这样我就可以做出一个条件,这很有效:

df.loc[(df['Age_days'] > timedelta(days=(25*365)), 'Age2')] = '1'

当我尝试提出两个条件时,它失败了:

df.loc[(df['Age_days'] > timedelta(days=(15*365)) & (df['Age_days'] <= timedelta(days=(25*365)), 'Age_cat'))] = '1'

我得到的错误说它不喜欢使用'&':

TypeError: unsupported operand type(s) for &: 'datetime.timedelta' and 'tuple'

我试过用'and'替换&,但它也不喜欢这样:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

知道我应该如何解决这个问题吗?

标签: pythonpandasdatetimecategorical-data

解决方案


对于 Pandas,您应该使用 Pandas 方法而不是datetime模块。

在这种情况下,您可以使用 NumPy 将timedelta值转换为float,然后用于pd.cut分箱您的年龄。默认情况下,pd.cut包含在每个范围的右侧。

df = pd.DataFrame({'Age': [10, 15, 17, 20, 25, 30, 35, 40]})
df['Age'] = pd.to_timedelta(df['Age'], unit='Y')

df['Category'] = pd.cut(df['Age'] / np.timedelta64(1, 'Y'), [15, 25, 35], labels=[1, 2])

print(df)

                  Age Category
0  3652 days 10:12:00      NaN
1  5478 days 15:18:00      NaN
2  6209 days 02:56:24      1.0
3  7304 days 20:24:00      1.0
4  9131 days 01:30:00      1.0
5 10957 days 06:36:00      2.0
6 12783 days 11:42:00      2.0
7 14609 days 16:48:00      NaN

然后,您可以删除空值并将类别转换为int(如果需要)。


推荐阅读