You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:51:23