如何在Python中将Snowflake上传的00YY格式日期转为20XX格式?
解决Snowflake导出日期「00YY-MM-DD」转「20YY-MM-DD」的问题
需求说明
从Snowflake获取的日期列ORDER_DATE格式为0022-10-02,需要批量转换为2022-10-02格式的NEW_DATE列。
现有代码问题分析
第一种方法失效原因
df["ORDER_DATE"] = pd.to_datetime(df["ORDER_DATE"], format='%YYYY%mm%dd', errors='ignore') def swap(x): return re.sub("^00", "20", x) if type(x) is str else x df.applymap(swap) print(df)
pd.to_datetime的format参数错误:正确格式符应为%Y%m%d,而非%YYYY%mm%dd;加上errors='ignore'会导致转换失败时直接保留原字符串,无法修正年份。df.applymap(swap)执行后未赋值回原DataFrame,原数据不会被修改,需改为df = df.applymap(swap)。
第二种方法无法自动化的原因
df["ORDER_DATE"] = pd.DataFrame({"ORDER_DATE": ["10-02-22", "10-02-22"] }) df.apply(lambda x:x.replace("^00", "20", regex=True)) print(df)
手动硬编码测试数据,未对接从Snowflake读取的真实数据源,无法实现自动化转换;且针对单列处理时,使用str.replace比apply更直接高效。
可行解决方案
方案1:Python端字符串批量替换(适用于字符串类型日期)
直接对ORDER_DATE列执行开头00的替换,生成NEW_DATE列:
# 假设df是从Snowflake读取后的DataFrame df["NEW_DATE"] = df["ORDER_DATE"].str.replace(r'^00', '20', regex=True) # 若需直接修改原列 # df["ORDER_DATE"] = df["ORDER_DATE"].str.replace(r'^00', '20', regex=True)
方案2:转换为datetime类型(更规范,支持后续日期运算)
先修正年份字符串,再转换为datetime类型,如需保留字符串格式可再格式化:
# 转换为datetime类型 df["NEW_DATE"] = pd.to_datetime(df["ORDER_DATE"].str.replace(r'^00', '20', regex=True)) # 若需保留YYYY-MM-DD字符串格式 df["NEW_DATE"] = pd.to_datetime(df["ORDER_DATE"].str.replace(r'^00', '20', regex=True)).dt.strftime('%Y-%m-%d')
方案3:Snowflake端SQL预处理(更高效)
在读取数据时直接用SQL修正日期,避免Python端额外处理:
SELECT ORDER_DATE, REPLACE(ORDER_DATE, '00', '20', 1) AS NEW_DATE FROM YOUR_TABLE_NAME;
REPLACE的第四个参数1表示仅替换第一个出现的00,避免误改日期中其他位置的字符。
内容的提问来源于stack exchange,提问作者mikestacker487
相关产品推荐
相关产品推荐

