在Databricks Python中正确转换7位TPC-DS朱利安日期为标准日历日期
错误原因及解决方法
错误原因
你混淆了**儒略日数(Julian Day Number, JD)**和yyyyDDD格式的日期字符串:
- TPC-DS中的
c_first_sales_date_sk存储的是儒略日数,这是一种从公元前4713年1月1日正午开始累计的天数,2449001对应的正是2024-01-01。 - 你错误地将其当作
yyyyDDD格式(年+年内天数)传入to_date,导致Spark解析时把2449识别为年份,001识别为该年的第1天,最终得到错误的2449-01-01。
正确转换方法
Spark没有直接解析儒略日数的内置函数,但可以通过两种方式转换:
方法1:利用日期偏移量计算
已知儒略日数2440588对应1970-01-01,通过计算目标日数与该基准日的差值,再用date_add生成日期:
from pyspark.sql.functions import col, date_add, lit df_with_date = df.withColumn( "c_first_sales_date", date_add(lit("1970-01-01"), col("c_first_sales_date_sk") - 2440588) ) display(df_with_date)
方法2:转换为Unix时间戳后解析
儒略日数2440587.5对应1970-01-01 00:00:00 UTC,将日数差值转换为秒数后,用from_unixtime解析并转为日期类型:
from pyspark.sql.functions import col, from_unixtime df_with_date = df.withColumn( "c_first_sales_date", from_unixtime((col("c_first_sales_date_sk") - 2440587.5) * 86400).cast("date") ) display(df_with_date)
两种方法都可以将2449001正确转换为2024-01-01。
内容的提问来源于stack exchange,提问作者crystyxn
相关产品推荐
相关产品推荐

