Python中DatetimeIndex转季度字符串遇UFuncTypeError求助
解决DatetimeIndex转换为季度字符串格式的问题
最优方案:使用Pandas原生方法(推荐)
不需要借助Numpy,Pandas的DatetimeIndex自带直接转换的方法,更简洁且不易出错:
import pandas as pd # 初始化你的DatetimeIndex proj_index = pd.DatetimeIndex( ['1990-03-31', '1990-06-30', '1990-09-30', '1990-12-31', '2017-03-31', '2017-06-30', '2017-09-30', '2017-12-31'], dtype='datetime64[ns]', length=112, freq='Q-DEC' ) # 方法1:用strftime格式化 proj_str = proj_index.strftime('%YQ%q') # 输出示例:array(['1990Q1', '1990Q2', ..., '2017Q4'], dtype='<U5') # 方法2:转换为季度Period后转字符串 proj_str = proj_index.to_period('Q').astype(str) # 输出示例:array(['1990Q1', '1990Q2', ..., '2017Q4'], dtype=object)
修复你原有Numpy代码的方案
如果你坚持使用Numpy处理,需要解决类型不匹配的问题:
错误原因分析
- 第一个错误
TypeError: can only concatenate str (not "numpy.bytes_") to str:np.char.array处理整数时生成的是字节型数组,直接与Python字符串'Q'拼接会触发类型冲突。 - 第二个错误
UFuncTypeError: ufunc 'add' did not contain a loop with signature matching types:对Numpy数组直接调用decode()无效,需用np.char.decode批量处理字节数组;同时拼接时要确保所有操作数都是同类型的Numpy字符数组。
修复后的代码
import numpy as np import pandas as pd proj_index = pd.DatetimeIndex( ['1990-03-31', '1990-06-30', '2017-12-31'], dtype='datetime64[ns]', freq='Q-DEC' ) # 方案1:先将整数转为字符串再创建Numpy字符数组 year_arr = np.char.array(proj_index.year.astype(str)) quarter_arr = np.char.array(proj_index.quarter.astype(str)) proj_index_str = year_arr + 'Q' + quarter_arr # 方案2:处理字节数组并解码 year_bytes = np.char.array(proj_index.year) year_str = np.char.decode(year_bytes, encoding='utf-8') quarter_bytes = np.char.array(proj_index.quarter) quarter_str = np.char.decode(quarter_bytes, encoding='utf-8') proj_index_str = year_str + 'Q' + quarter_str
两种方案最终都会得到你期望的格式:array(['1990Q1', '1990Q2', ..., '2017Q4'], dtype='<U5')
内容的提问来源于stack exchange,提问作者Amel Laref
相关产品推荐
相关产品推荐

