PySpark如何在字符串中间插入字符以转换为Timestamp?
解决方案:给时间字符串插入冒号
这个需求在处理时间格式转换时很常见,我给你两种实用的方案,分别适配单个字符串处理和批量数据场景:
方法1:Python原生正则替换(通用场景)
如果是处理单个字符串或者列表里的零散字符串,用正则表达式替换最直接。核心思路是把每一组4位数字拆成前两位和后两位,中间插入冒号:
import re original_str = "Hour 0045 2322" formatted_str = re.sub(r'(\d{2})(\d{2})', r'\1:\2', original_str) print(formatted_str) # 输出: Hour 00:45 23:22
简单解释下:
- 正则
(\d{2})(\d{2})会把连续4位数字拆成两个捕获组(前两位和后两位) - 替换模板
\1:\2会把两个捕获组用冒号拼接起来,自动处理所有符合规则的4位数字片段
方法2:Pandas批量处理DataFrame列(适合数据分析场景)
如果你的数据存在Pandas DataFrame的列中,直接用str.replace结合正则就能批量完成格式转换,之后还能直接转成Timestamp类型:
import pandas as pd # 模拟你的数据 df = pd.DataFrame({'time_col': ["Hour 0045 2322", "Hour 1234 0506", "Hour 0915 2040"]}) # 批量格式化列 df['formatted_time'] = df['time_col'].str.replace(r'(\d{2})(\d{2})', r'\1:\2', regex=True) # 转换为Timestamp类型 df['timestamp'] = pd.to_datetime(df['formatted_time'], format='Hour %H:%M %H:%M') print(df)
运行后输出:
time_col formatted_time timestamp 0 Hour 0045 2322 Hour 00:45 23:22 1900-01-01 00:45:00 1 Hour 1234 0506 Hour 12:34 05:06 1900-01-01 12:34:00 2 Hour 0915 2040 Hour 09:15 20:40 1900-01-01 09:15:00
注意这里pd.to_datetime的format参数要和你格式化后的字符串完全匹配,确保解析正确。如果你的时间串包含日期信息,只需要调整format模板即可。
小提示
如果担心正则误匹配其他4位数字(比如字符串里有非时间的4位数字),可以把正则写得更精准,比如只匹配Hour 后面的4位数字:
formatted_str = re.sub(r'(?<=Hour )(\d{2})(\d{2})', r'\1:\2', original_str)
不过根据你描述的固定格式,通用正则已经足够好用了。
内容的提问来源于stack exchange,提问作者BryceSoker
相关产品推荐
相关产品推荐

