Python:移除列表中Timestamp字符串首尾标识,适配SQL Server datetime插入
解决Python中Timestamp类型值转SQL Server兼容日期字符串的问题
需求
将列表中的Timestamp类型值转换为纯日期时间字符串(移除开头的Timestamp(和结尾的)),使其能插入SQL Server的datetime字段。
现有方案的问题
此前尝试的两种列表推导式均存在缺陷:
- 方案1:直接对非None值做字符串替换,会误处理带括号的普通元素(比如
(HELLO)会被处理成(HELLO)。 - 方案2:添加了字符串开头/结尾的判断,但由于Timestamp对象的字符串表示是大写
Timestamp(...),而判断用的是小写timestamp(,导致匹配失效,无法处理目标值。
正确实现方案
核心思路是直接判断值的类型,而非通过字符串特征匹配,同时利用Timestamp对象的格式化方法生成标准日期字符串,避免字符串替换的风险。
代码实现
from pandas import Timestamp, NaT modified_row_values = [1, '508', '505', '613', 'CHRIST', 'LAKE ROAD', None, 'PARK', 'Orange', '156789', 'XXX-XXX-XXXX', '1', 'NNE', 'ONNE', 'LAKE ROAD', None, 'PARK', 'NY', '123456', 'SCpython@GMAIL.COM', '9CC271', '9CC271', '9CC271', '41.200263', '-74.2094', 'Karl', Timestamp('2022-12-21 17:00:00'), NaT, Timestamp('2022-12-21 17:00:00'), 'Y', 'Y', 'Y', None, 'XTU', None, None, None, None, None, None, Timestamp('2022-12-21 16:24:04')] # 列表推导式版本 processed_values = [ value.strftime('%Y-%m-%d %H:%M:%S') if isinstance(value, Timestamp) else None if value is NaT else value for value in modified_row_values ] # 循环版本(可读性更强) processed_values = [] for value in modified_row_values: if isinstance(value, Timestamp): # 生成SQL Server datetime兼容的格式 processed_values.append(value.strftime('%Y-%m-%d %H:%M:%S')) elif value is NaT: # 将NaT转为None,对应SQL的NULL processed_values.append(None) else: processed_values.append(value)
说明
- 通过
isinstance(value, Timestamp)精准识别Timestamp类型值,不会误判其他带括号的字符串。 - 使用
strftime('%Y-%m-%d %H:%M:%S')生成SQL Server datetime字段支持的标准日期字符串,比字符串替换更可靠。 - 单独处理
NaT,将其转为None,对应SQL中的NULL值。
内容的提问来源于stack exchange,提问作者SC_Python
相关产品推荐
相关产品推荐

