如何将pandas中提取的mm/yy格式内容转为可排序的日期类型而非object
strftime方法生成的是字符串类型,因此M/Y列会被识别为object类型,字符串默认按字典序排序,会出现12/08排在01/09前面的错误,不符合时间排序逻辑。
方案1:使用月份Period类型(推荐)
pandas的Period类型专门用于处理周期时间,既保留时间属性可正确排序,也可按需格式化为01/09的显示效果:
# 先将Order Date转为标准日期类型 data['Order Date'] = pd.to_datetime(data['Order Date']) # 生成月份周期列,类型为period[M],天然支持时间顺序排序 data['M/Y'] = data['Order Date'].dt.to_period('M')
绘图时如果需要x轴显示为%m/%y格式,仅需设置刻度格式化器即可,无需修改源数据:
import matplotlib.pyplot as plt import matplotlib.dates as mdates ax = data.sort_values('M/Y').plot(x='M/Y', y='你的数值列', kind='line') # 设置x轴显示格式为月/两位年 ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%y')) plt.show()
方案2:保留字符串显示列,搭配辅助排序列
如果必须要M/Y列为01/09格式的字符串,可以额外增加一个日期类型的辅助列用于排序:
data['Order Date'] = pd.to_datetime(data['Order Date']) # 辅助排序列:取对应月份的第一天,日期类型可正确排序 data['sort_month'] = data['Order Date'].dt.to_period('M').dt.to_timestamp() # 生成显示用的字符串格式月份 data['M/Y'] = data['Order Date'].dt.strftime('%m/%y') # 排序时使用辅助列,绘图时用M/Y作为x轴即可 data_sorted = data.sort_values('sort_month') data_sorted.plot(x='M/Y', y='你的数值列', kind='line')
另外你原代码中的apply调用是不必要的,直接使用dt访问器处理整列的效率远高于逐行apply。
内容的提问来源于stack exchange,提问作者Islam Mammadov
相关产品推荐
相关产品推荐

