如何用Python将CSV中日月格式列值转换为指定数字格式?
解决CSV中Room列日月格式转数字格式的问题
需求说明
需要将CSV文件中Room列的日月格式(如1-Feb、3-Mar)转换为月份数字-日期数字的格式,对应规则示例:
1-Feb→2-12-Feb→2-23-Mar→3-34-Mar→3-4
修改后的完整代码
import os import pandas as pd # 定义月份缩写到数字的映射字典 month_map = { 'Jan': '1', 'Feb': '2', 'Mar': '3', 'Apr': '4', 'May': '5', 'Jun': '6', 'Jul': '7', 'Aug': '8', 'Sep': '9', 'Oct': '10', 'Nov': '11', 'Dec': '12' } def convert_room_format(room_str): # 拆分日期和月份部分,比如"1-Feb"拆分为["1", "Feb"] day, month_abbr = room_str.split('-') # 替换月份缩写为对应数字,再拼接成目标格式 return f"{month_map[month_abbr]}-{day}" directory = 'C:/Path' ext = ('.csv') for filename in os.listdir(directory): f = os.path.join(directory, filename) if f.endswith(ext): head_tail = os.path.split(f) head_tail1 = 'C:/Path' k = head_tail[1] r = k.split(".")[0] p = head_tail1 + "/" + r + " - Revised.csv" mydata = pd.read_csv(f) # 提取目标列 new = mydata[["A","Room","C","D"]] # 核心:转换Room列格式 new['Room'] = new['Room'].apply(convert_room_format) # 后续原有逻辑保持不变 new = new.rename(columns={'D': 'Qty. of Parts'}) new['Qty. of Parts'] = 1 # 合并列逻辑(新增类型转换确保拼接正常) merge_columns = ['A', 'Room', 'C'] merged_col = ''.join(merge_columns).replace('ARoomC', 'F') new[merged_col] = new[merge_columns].apply(lambda x: '.'.join(x.astype(str)), axis=1) new.drop(merge_columns, axis=1, inplace=True) new = new.groupby(merged_col).count().reset_index() new.to_csv(p, index=False)
关键修改说明
- 月份映射字典:提前定义全量英文月份缩写对应的数字,确保转换时能准确匹配所有可能的月份
- 转换函数:通过
split('-')拆分日期和月份,用映射字典替换缩写为数字后拼接成目标格式 - 批量转换:用
pandas的apply方法对Room列逐行应用转换函数,实现批量处理 - 类型兼容处理:合并列时新增
astype(str),确保所有列都转为字符串后再拼接,避免因类型不一致导致的报错
内容的提问来源于stack exchange,提问作者QuickSilver42
相关产品推荐
相关产品推荐

