如何优化pandas中挪威D号、S号格式日期转标准日期的实现
挪威D号/S号日期编码转换高效实现方案
核心优化思路
- 抛弃逐行循环逻辑,全部使用pandas内置的向量化操作,数据量越大执行效率优势越明显,相比循环方案提升可达数十至上百倍
- 用
str.zfill(6)直接统一补全前导零到6位,无需手动判断字符串长度 - 用布尔掩码批量命中符合D号、S号规则的记录,统一做编码转换
代码实现
import pandas as pd def convert_dates(s): # 统一转字符串并补全前导零到6位 s_str = s.astype(str).str.zfill(6) # 处理D号规则:第一位数字>3时减4 first_digit = s_str.str.get(0).astype(int) d_mask = first_digit > 3 s_str = s_str.mask(d_mask, (first_digit[d_mask] - 4).astype(str) + s_str.str[1:]) # 处理S号规则:第三位数字>1时减5 third_digit = s_str.str.get(2).astype(int) s_mask = third_digit > 1 s_str = s_str.mask(s_mask, s_str.str[:2] + (third_digit[s_mask] - 5).astype(str) + s_str.str[3:]) return s_str
效果验证
使用示例数据测试:
df = pd.DataFrame({'dates': [241290, 710586, 105299, 56187]}) df['converted'] = convert_dates(df['dates'])
输出结果:
| dates | converted | 对应标准日期 |
|---|---|---|
| 241290 | 241290 | 24.12.90 |
| 710586 | 310586 | 31.05.86 |
| 105299 | 100299 | 10.02.99 |
| 56187 | 051187 | 05.11.87 |
内容的提问来源于stack exchange,提问作者user3306199
相关产品推荐
相关产品推荐

