如何在PySpark中转换/Date(1593786688000+0200)/格式的日期时间?
转换DataFrame中的特殊日期格式为标准带时区格式
实现思路
对应你提供的SQL解析逻辑,我们可以通过Pandas的字符串提取+时间转换完成需求:
- 从
/Date(时间戳+时区)/格式中拆分出毫秒级时间戳和时区偏移(如+0200) - 将时间戳转换为UTC时间,再叠加时区偏移得到目标格式
代码实现(基础版)
import pandas as pd from datetime import datetime, timedelta # 示例DataFrame df = pd.DataFrame({ 'CreateDate': [ '/Date(1593786688000+0200)/', '/Date(1446032157000+0100)/', '/Date(1533904635000+0200)/', '/Date(1447839805000+0100)/', '/Date(1589451249000+0200)/' ] }) # 提取时间戳和时区偏移 df[['timestamp_ms', 'tz_offset']] = df['CreateDate'].str.extract(r'/Date\((\d+)([+-]\d{4})\)/') # 定义转换函数 def parse_date(row): # 毫秒转秒 ts = int(row['timestamp_ms']) / 1000 # 生成UTC时间 utc_dt = datetime.utcfromtimestamp(ts) # 解析时区小时和分钟 sign = row['tz_offset'][0] hour = int(row['tz_offset'][1:3]) minute = int(row['tz_offset'][3:5]) # 计算时区偏移量 delta = timedelta(hours=hour, minutes=minute) if sign == '-': delta = -delta # 生成目标格式字符串 local_dt = utc_dt + delta return f"{local_dt.strftime('%Y-%m-%d %H:%M:%S')} {sign}{hour:02d}:{minute:02d}" # 应用转换并清理临时列 df['CreateDate'] = df.apply(parse_date, axis=1) df = df.drop(['timestamp_ms', 'tz_offset'], axis=1) print(df)
运行结果
CreateDate 0 2020-07-03 14:31:28 +02:00 1 2015-10-28 11:35:57 +01:00 2 2018-08-10 12:37:15 +02:00 3 2015-11-18 09:43:25 +01:00 4 2020-05-14 10:14:09 +02:00
进阶版(生成带时区的datetime对象)
如果需要将列转换为真正的时区感知datetime类型(而非字符串),可以用Python3.9+的zoneinfo模块:
import pandas as pd from zoneinfo import ZoneInfo df = pd.DataFrame({ 'CreateDate': [ '/Date(1593786688000+0200)/', '/Date(1446032157000+0100)/', '/Date(1533904635000+0200)/', '/Date(1447839805000+0100)/', '/Date(1589451249000+0200)/' ] }) # 提取时间戳和时区字符串 df[['timestamp_ms', 'tz_hhmm']] = df['CreateDate'].str.extract(r'/Date\((\d+)([+-]\d{4})\)/') # 转换为UTC时间戳 df['utc_dt'] = pd.to_datetime(df['timestamp_ms'], unit='ms', utc=True) # 构造符合zoneinfo要求的时区标识(注意Etc/GMT的偏移符号是反的) df['tz'] = df['tz_hhmm'].apply(lambda x: f'Etc/GMT{x.replace("+", "-").replace("-", "+")}') # 转换为带时区的datetime df['CreateDate'] = df.apply(lambda x: x['utc_dt'].astimezone(ZoneInfo(x['tz'])), axis=1) # 格式化显示为目标字符串格式 df['CreateDate'] = df['CreateDate'].dt.strftime('%Y-%m-%d %H:%M:%S %z').str.replace(r'([+-]\d{2})(\d{2})', r'\1:\2', regex=True) # 清理临时列 df = df.drop(['timestamp_ms', 'tz_hhmm', 'utc_dt', 'tz'], axis=1)
内容的提问来源于stack exchange,提问作者coding
相关产品推荐
相关产品推荐

