You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:15:40