如何给Pandas DataFrame添加列:将缩写星期转换为星期编号
问题
我想给一个包含星期缩写(如'MON'、'TUE'、'WED')的Pandas DataFrame添加星期编号列,试了用pd.to_datetime配合format='%w',但这个方法识别不了'MON'这类缩写值。
示例数据:
import pandas as pd s = pd.DataFrame(data={'ord_day': ['TUE', 'MON','TUE','WED','FRI']}) s
输出:
ord_day 0 TUE 1 MON 2 TUE 3 WED 4 FRI
错误尝试代码:
s['weekday'] = pd.to_datetime(s['ord_day'],format ='%w')
解决办法
方法1:直接用字典映射(最省心)
星期缩写是固定的,直接做个映射字典对应到你要的编号就行,比如把周一设为0,周二1,以此类推:
weekday_map = {'MON': 0, 'TUE': 1, 'WED': 2, 'THU': 3, 'FRI': 4, 'SAT': 5, 'SUN': 6} s['weekday'] = s['ord_day'].map(weekday_map)
运行后结果:
ord_day weekday 0 TUE 1 1 MON 0 2 TUE 1 3 WED 2 4 FRI 4
方法2:用datetime解析缩写
如果想用日期解析的方式,可以借助datetime模块的strptime识别英文星期缩写:
from datetime import datetime # weekday()返回周一=0,周日=6;要是想周日=0,用isoweekday()后减1 s['weekday'] = s['ord_day'].apply(lambda x: datetime.strptime(x, '%a').weekday())
注意:这个方法要求系统环境支持英文星期解析,若系统语言为中文,可能需要先调整环境变量。
方法3:用分类数据指定顺序
如果之后需要按星期顺序排序(而非字母顺序),可以把ord_day设为分类类型,再取编码:
week_order = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'] s['ord_day'] = pd.Categorical(s['ord_day'], categories=week_order, ordered=True) s['weekday'] = s['ord_day'].cat.codes
这样后续对ord_day排序时,会按照周一到周日的逻辑顺序排列,而非字母排序。
内容的提问来源于stack exchange,提问作者Liam Hetherington
相关产品推荐
相关产品推荐

