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

本地Jupyter可运行的Python代码在VS Code(SSH)中执行失败

问题分析与解决方案

原代码在本地Jupyter Notebook正常运行,但通过SSH在VSCode中执行时df.loc[i, j] = hour赋值失效,核心原因通常和pandas数据类型约束、视图/副本赋值限制或环境配置差异有关,以下是具体修复方案:

可能的问题点

  1. 目标列是timedelta类型,直接赋值字符串会触发pandas类型检查,VSCode环境可能比Jupyter更严格,拒绝隐式类型转换
  2. 嵌套循环逐行赋值效率极低,容易触发SettingWithCopyWarning,若环境中该警告被设为raise会直接中断赋值
  3. 冗余的np.array([millis])循环完全没必要,徒增代码复杂度

优化修复代码(推荐矢量化操作)

直接利用pandas内置方法处理timedelta类型,避免逐行循环的兼容性问题:

import pandas as pd

# 遍历目标列
for col in columns:
    # 提取timedelta的时分秒组件并格式化为字符串
    df[col] = df[col].apply(lambda td: f"{td.components.hours}:{td.components.minutes}:{td.components.seconds}")

或者通过转成datetime对象格式化的方式实现:

for col in columns:
    # 将timedelta总秒数转为datetime后格式化
    df[col] = pd.to_datetime(df[col].dt.total_seconds(), unit='s').dt.strftime('%H:%M:%S')

兼容原逻辑的修复方案(不推荐,仅作参考)

如果必须保留逐行赋值逻辑,先将目标列转为object类型解除类型约束:

# 先将列转为object类型,允许字符串赋值
for col in columns:
    df[col] = df[col].astype(object)

# 执行原逻辑(移除冗余的np.array循环)
for i in df.index:
    for j in columns:
        td = df.loc[i, j]
        millis = round(int(td.value / 1e6))
        seconds = (millis // 1000) % 60
        minutes = (millis // (1000 * 60)) % 60
        hours = (millis // (1000 * 60 * 60)) % 24
        df.loc[i, j] = f"{hours}:{minutes}:{seconds}"

内容的提问来源于stack exchange,提问作者Milton De Marte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 05:03:18