如何在Python(pandas)中将/Date(1656626400000+0200)/转为datetime?
解决微软JSON格式日期转Pandas Datetime的方法
针对你遇到的/Date(1656626400000+0200)/这类微软JSON日期格式,直接用pd.to_datetime()无法解析,需要先提取其中的毫秒时间戳和时区偏移,再进行转换,以下是两种高效实现方式:
方法一:批量提取+向量式处理(适合大数据量)
利用Pandas的字符串提取功能批量解析日期组件,再统一转换,效率更高:
import pandas as pd # 示例数据 df = pd.DataFrame({ 'date_col': ['/Date(1656626400000+0200)/', '/Date(1640995200000-0500)/', '无效格式'] }) # 正则提取毫秒时间戳和时区偏移(捕获组分别对应数字和时区) df[['timestamp_ms', 'tz_offset']] = df['date_col'].str.extract(r'/Date\((\d+)([+-]\d{4})\)/') # 转换为datetime:先处理毫秒时间戳,再绑定时区 df['datetime'] = pd.to_datetime(df['timestamp_ms'].astype('Int64'), unit='ms') # Int64支持空值 df['datetime'] = df.apply( lambda row: row['datetime'].tz_localize(row['tz_offset']) if pd.notna(row['datetime']) else pd.NaT, axis=1 )
方法二:自定义函数+apply(灵活处理异常)
如果需要对异常格式做更精细的判断,用自定义函数结合apply更灵活:
import pandas as pd import re def parse_ms_date(s): # 匹配日期格式,提取毫秒戳和时区 match = re.fullmatch(r'/Date\((\d+)([+-]\d{4})\)/', str(s)) if not match: return pd.NaT # 格式无效返回空值 ts_ms, tz = match.groups() # 毫秒转datetime并绑定时区 return pd.to_datetime(int(ts_ms), unit='ms').tz_localize(tz) # 应用到列 df['datetime'] = df['date_col'].apply(parse_ms_date)
关键说明
- 这类格式是微软序列化JSON时常用的日期格式,核心是13位毫秒时间戳+时区偏移(如+0200表示东二区)
tz_localize()用于将 naive datetime 转换为带时区感知的 datetime,避免时区信息丢失- 两种方法都处理了格式无效的情况,返回
pd.NaT保证数据完整性
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

