使用np.where创建列:实现时间单位转天数功能
单位转天数的实现方案
问题分析
你的代码存在三个核心问题:
np.where语法错误:正确格式是np.where(条件, 满足时的值, 不满足时的值),你多套了一层括号,导致语法报错。- 分支覆盖不全:只处理了
weeks一种单位,没实现年、月、天的转换规则。 - 单复数未统一:单位存在
week/weeks、year/years这类单复数差异,需要统一匹配逻辑。
解决方案1:改进多层np.where实现
先统一单位为单数,再通过多层np.where依次判断不同单位的转换规则:
import pandas as pd import numpy as np nums = [2, 3, 4, 1, 4, 2, 4, 11, 1, 1] units = ['days', 'weeks', 'year', 'month', 'days', 'weeks', 'years', 'months', 'day', 'week'] df = pd.DataFrame({'nums': nums, 'units': units}) def convert_days(var1, var2, var3): # 用正则去掉单位末尾的s,统一为单数形式 unit_singular = df[var1].str.replace(r's$', '', regex=True) # 多层np.where依次匹配不同单位的转换规则 df[var3] = np.where(unit_singular == 'week', df[var2] * 7, np.where(unit_singular == 'month', df[var2] * 12, np.where(unit_singular == 'year', df[var2] * 365, df[var2]))) return df # 调用函数生成结果 result_df = convert_days('units', 'nums', 'test') print(result_df)
解决方案2:字典映射(更简洁易维护)
定义包含单复数的转换系数字典,直接映射后计算,可读性和扩展性更好:
import pandas as pd nums = [2, 3, 4, 1, 4, 2, 4, 11, 1, 1] units = ['days', 'weeks', 'year', 'month', 'days', 'weeks', 'years', 'months', 'day', 'week'] df = pd.DataFrame({'nums': nums, 'units': units}) # 定义所有单位(含单复数)到转换系数的映射 conversion_map = { 'day': 1, 'days': 1, 'week': 7, 'weeks': 7, 'month': 12, 'months': 12, 'year': 365, 'years': 365 } # 直接通过映射系数计算天数 df['test'] = df['nums'] * df['units'].map(conversion_map) print(df)
两种方案对比
- 多层
np.where:适合分支较少的场景,但分支增多后可读性会下降。 - 字典映射:规则清晰,后续新增或修改单位转换规则时,只需调整字典即可,维护成本更低。
内容的提问来源于stack exchange,提问作者Moses
相关产品推荐
相关产品推荐

