PySpark中JDE儒略日期转公历日期的正确实现方案
JDE企业版儒略日期转公历日期(PySpark实现)
JDE企业版的儒略日期是6位数字格式,结构规则为:
- 前3位:相对于1900年的年份偏移量(如
123对应1900+123=2023年,000对应1900年) - 后3位:对应年份内的第几天(如
002对应当年第2天,即1月2日)
你之前的代码错误地将其当作yyMMdd格式解析,这是导致转换失败的核心原因。以下是正确的转换实现:
完整代码实现
from pyspark.sql import functions as F from pyspark.sql.types import StringType # 若ILDGL是数字类型,先转换为字符串(字符串类型可跳过此步骤) df = df.withColumn("ILDGL_str", F.col("ILDGL").cast(StringType())) # 计算转换后的公历日期 df = df.withColumn( "ILDGL_Normal", F.date_add( # 生成目标年份的1月1日作为基准日期 F.make_date( F.substring(F.col("ILDGL_str"), 1, 3).cast("int") + 1900, 1, 1 ), # 年内天数减1:因为1月1日是当年第1天,无需偏移 F.substring(F.col("ILDGL_str"), 4, 3).cast("int") - 1 ) ) # 可选:删除中间临时列 df = df.drop("ILDGL_str")
逻辑验证
针对你给出的测试用例:
- 输入
123002:年份偏移123→1900+123=2023,年内天数002→2-1=1,date_add(2023-01-01, 1)得到2023-01-02,符合预期 - 输入
000001:年份偏移0→1900,年内天数001→1-1=0,date_add(1900-01-01, 0)得到1900-01-01,符合预期
该实现会自动处理闰年等边界场景(如2020年的第366天120366会正确转换为2020-12-31)。
内容的提问来源于stack exchange,提问作者Arpan Ghimire
相关产品推荐
相关产品推荐

