如何为DataFrame新增基于os文件修改时间减1月的FileMonth列
问题根因
你当前代码中计算File Month使用的dt是独立于遍历逻辑的全局固定时间值,没有和每行数据对应的源文件修改时间做绑定,遍历完成后整列赋值的写法会导致所有行复用同一个计算结果,自然无法匹配不同文件的实际存入时间。
实现方案
在遍历目录处理单个文件的流程中同步完成FileMonth值计算,保证每行数据和对应文件的修改时间一一映射,不要在全量文件遍历结束后单独给该列赋值:
- 遍历到单个文件时,先用
os.path.getmtime()获取该文件的修改时间戳,转换为datetime对象 - 基于该文件自己的修改时间做1个月偏移,直接使用
pd.DateOffset(months=1)做月份计算,比手动调整日期再减天的逻辑更稳定,不会触发月末、跨年的边界bug - 将计算得到的MM-YYYY格式字符串,和从该文件提取的Partner、Zip、Phone字段一起写入DataFrame的对应行
可直接参考的实现代码:
import os import pandas as pd from datetime import datetime # 初始化DataFrame,提前定义好所有列 temp = pd.DataFrame(columns=["Partner", "Zip", "Phone", "File Month"]) # 替换为你实际要遍历的目录路径 scan_dir = "/your/target/dir/path" for file_name in os.listdir(scan_dir): full_path = os.path.join(scan_dir, file_name) # 跳过子目录、软链等非文件节点 if not os.path.isfile(full_path): continue # 获取当前文件的实际修改时间 file_mtime = datetime.fromtimestamp(os.path.getmtime(full_path)) # 计算减1个月的月份,格式化为要求的MM-YYYY格式 cal_month = (file_mtime - pd.DateOffset(months=1)).strftime("%m-%Y") # --- 下方替换为你原有的从当前文件提取Partner/Zip/Phone的逻辑 --- partner_val = "从当前文件解析得到的Partner值" zip_val = "从当前文件解析得到的Zip值" phone_val = "从当前文件解析得到的Phone值" # --- 原有提取逻辑结束 --- # 将当前文件对应的整行数据追加到DataFrame temp.loc[len(temp)] = [partner_val, zip_val, phone_val, cal_month]
注意事项
- 如果你之前的逻辑是先把所有文件的Partner/Zip/Phone数据收集完写入temp,再单独给FileMonth列赋值,需要额外在遍历阶段把每个文件的修改时间也同步存为temp的临时列,最后基于该临时列做月份计算再删除临时列,不推荐这种写法,直接在单文件处理环节算完效率更高。
- 不要使用减固定天数、手动改日字段的方式算上月月份,遇到1月、31天月末等场景容易出现计算偏差,直接调用pandas的月份偏移接口即可保证准确性。
内容的提问来源于stack exchange,提问作者user18572659
相关产品推荐
相关产品推荐

