本地Jupyter可运行的Python代码在VS Code(SSH)中执行失败
问题分析与解决方案
原代码在本地Jupyter Notebook正常运行,但通过SSH在VSCode中执行时df.loc[i, j] = hour赋值失效,核心原因通常和pandas数据类型约束、视图/副本赋值限制或环境配置差异有关,以下是具体修复方案:
可能的问题点
- 目标列是
timedelta类型,直接赋值字符串会触发pandas类型检查,VSCode环境可能比Jupyter更严格,拒绝隐式类型转换 - 嵌套循环逐行赋值效率极低,容易触发
SettingWithCopyWarning,若环境中该警告被设为raise会直接中断赋值 - 冗余的
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
相关产品推荐
相关产品推荐

