Python中pandas拼接年月列转YYYYmmdd格式1月被识别为10月问题求解
问题根因
你遇到的问题是月份转字符串后没有补前导零导致的:
- 月份为1时,转字符串得到的是
"1"而非"01",拼接后得到的字符串格式是类似2023101(7位) - 用
format='%Y%m%d'解析时,会按4位年、2位月、2位日的规则拆分,7位字符串会被拆为年=2023、月=10、日=1,因此1月的记录全部被识别为10月1日。
解决方案
方案1:修改原有拼接逻辑,给月份补前导零
只需要在月份转字符串后调用str.zfill(2)方法,自动给不足2位的内容补前导零即可,修改后代码如下:
dfyz_m_d['dt'] = '01'# 为每个月生成固定的1号日期 # 月份转字符串后补前导零到2位 dfyz_m_d['CalendarWeek1'] = dfyz_m_d['year'].map(str) + dfyz_m_d['mon'].map(str).str.zfill(2) + dfyz_m_d['dt'].map(str) dfyz_m_d['CalendarWeek'] = pd.to_datetime(dfyz_m_d['CalendarWeek1'], format='%Y%m%d')
方案2:更简洁的原生方法(推荐)
Pandas的pd.to_datetime本身支持直接解析包含年、月、日字段的DataFrame,不需要手动拼接字符串,代码更简洁也不会出现格式错误:
# 直接指定年、月列,手动指定日为1即可 dfyz_m_d['CalendarWeek'] = pd.to_datetime(dfyz_m_d[['year', 'mon']].assign(day=1))
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

