PySpark中时间戳转换:Epoch与日期互转及精度识别
技术问题解答
1. Epoch时间戳1668443121840转日期2022-11-14T16:25:21.840+0000的具体过程
这个时间戳是毫秒级精度(共13位),转换步骤如下:
- 拆分秒数与毫秒部分:将1668443121840除以1000,得到整数秒
1668443121,剩余的840是毫秒部分。 - 转换为UTC datetime对象:用Python的
datetime.utcfromtimestamp(1668443121)得到基础时间2022-11-14 16:25:21。 - 拼接毫秒并格式化时区:将毫秒部分添加到时间中,再格式化为带UTC时区的字符串,最终得到
2022-11-14T16:25:21.840+0000。
对应Python代码示例:
import datetime ts = 1668443121840 # 转换为带毫秒的UTC时间 utc_dt = datetime.datetime.utcfromtimestamp(ts / 1000) # 格式化目标字符串 formatted = utc_dt.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + '+0000' print(formatted) # 输出:2022-11-14T16:25:21.840+0000
2. 如何识别Epoch时间戳的精度
主要通过位数长度和转换验证判断:
- 10位:秒级精度,例如
1668443121对应2022年左右的时间。 - 13位:毫秒级精度,例如问题中的
1668443121840。 - 16位:微秒级精度,例如
1668443121840123。 - 19位:纳秒级精度,例如
1668443121840123456。
如果位数不典型,可以尝试按不同精度转换为日期:若按秒转换得到合理的近期时间,就是秒级;若得到的时间是未来几百年,则说明是更高精度(比如把毫秒当成秒的话,时间会是5万多年后)。
3. PySpark中将日期转回Epoch时间戳的函数及精度控制
PySpark提供多个函数支持不同精度的转换:
- 秒级时间戳:用
unix_timestamp函数,默认解析yyyy-MM-dd HH:mm:ss格式,也可指定格式:from pyspark.sql.functions import unix_timestamp df.withColumn("epoch_seconds", unix_timestamp("date_col", "yyyy-MM-dd HH:mm:ss")) - 毫秒级时间戳:用
unix_millis函数(需Spark 3.0+),接收TimestampType类型的列:from pyspark.sql.functions import unix_millis, to_timestamp df.withColumn("epoch_millis", unix_millis(to_timestamp("date_col", "yyyy-MM-dd HH:mm:ss"))) - 微秒/纳秒级:对应
unix_micros、unix_nanos函数,用法和unix_millis类似。
关于你Python代码的问题
你用strftime('%s')只能输出秒级时间戳,且该写法在部分Python版本/系统中兼容性差。要控制精度,建议用datetime.timestamp()方法,再乘以对应倍数:
import datetime t = datetime.datetime.strptime('2021-11-12 02:12:23', '%Y-%m-%d %H:%M:%S') # 秒级 print(int(t.timestamp())) # 毫秒级 print(int(t.timestamp() * 1000)) # 微秒级 print(int(t.timestamp() * 1_000_000))
内容的提问来源于stack exchange,提问作者Swapnil
相关产品推荐
相关产品推荐

