Pandas中无年份的日期列转换失败问题求助
Pandas中无年份的日期列转换失败问题求助
我在尝试用Pandas转换日期列时遇到了困难,表格里没有包含年份,这似乎让转换变得棘手。
我的数据如下:
28 JUL Unnamed: 0 Alura *Alura - 7/12 68,00 0 28 JUL NaN Passei Direto S/A. - 3/12 19,90 1 31 JUL NaN Drogarias Pacheco 25,99 2 31 JUL NaN Mundo Verde - Rj - Sho 5,90 3 31 JUL NaN Paypal *99app 4,25 4 04 AGO NaN Saldo em atraso 1.091,17 5 04 AGO NaN Crédito de atraso 1.091,17 6 06 AGO NaN Apple.Com/Bill 34,90 7 07 AGO NaN Pagamento em 07 AGO 1.091,17 8 07 AGO NaN Juros de atraso 16,86 9 07 AGO NaN IOF de atraso 4,43 10 07 AGO NaN Multa de atraso 21,91 11 08 AGO NaN Apple.Com/Bill 21,90 12 09 AGO NaN Google Youtubepremium 20,90 13 10 AGO NaN Amazon.Com.Br 41,32 14 12 AGO NaN Uber *Uber *Trip 17,91 15 12 AGO NaN Uber *Uber *Trip 16,94 16 12 AGO NaN Mia Cookies 47,50 17 13 AGO NaN Uber *Uber *Trip 16,96 18 13 AGO NaN Uber *Uber *Trip 19,98 19 16 AGO NaN Uber *Uber *Trip 11,93 20 16 AGO NaN Uber *Uber *Trip 9,97 21 18 AGO NaN Uber *Uber *Trip 9,91 22 22 AGO NaN Uber *Uber *Trip 9,96 23 23 AGO NaN Amazonprimebr 14,90 24 27 AGO NaN Paypal *Sacocheiotv 15,00 25 27 AGO NaN Pag*Easymarketpleno 6,50
我尝试用这段代码转换,但没有成功:
df["Data"] = pd.to_datetime(df["Data"], format="%d %b", errors="coerce")
得到的错误输出(部分日期变成了NaT,且年份默认是1900):
Data Local Valor 0 1900-07-28 Alura *Alura - 7/12 68,00 1 1900-07-28 Passei Direto S/A. - 3/12 19,90 2 1900-07-31 Drogarias Pacheco 25,99 3 1900-07-31 Mundo Verde - Rj - Sho 5,90 4 1900-07-31 Paypal *99app 4,25 7 NaT Apple.Com/Bill 34,90 9 NaT Juros de atraso 16,86 10 NaT IOF de atraso 4,43 11 NaT Multa de atraso 21,91 12 NaT Apple.Com/Bill 21,90 13 NaT Google Youtubepremium 20,90 14 NaT Amazon.Com.Br 41,32 15 NaT Uber *Uber *Trip 17,91 16 NaT Uber *Uber *Trip 16,94 17 NaT Mia Cookies 47,50 18 NaT Uber *Uber *Trip 16,96 19 NaT Uber *Uber *Trip 19,98 20 NaT Uber *Uber *Trip 11,93 21 NaT Uber *Uber *Trip 9,97 22 NaT Uber *Uber *Trip 9,91 23 NaT Uber *Uber *Trip 9,96 24 NaT Amazonprimebr 14,90 25 NaT Paypal *Sacocheiotv 15,00 26 NaT Pag*Easymarketpleno 6,50
有没有人能帮我解决这个问题?
嘿,我来帮你梳理下问题,然后给出几个可行的解决办法~
问题出在哪?
你遇到的两个核心问题:
- 月份缩写语言不兼容:你的日期用的是葡萄牙语的月份缩写(比如
JUL是葡语的七月,AGO是八月),但Pandas默认是按英文的月份缩写(Jul、Aug)来解析的,所以碰到AGO这类葡语缩写时就会解析失败,出现NaT。 - 默认年份不对:只给日和月的话,Pandas会自动填1900年,这显然不符合你的实际需求(从数据看应该是最近的年份,比如2024)。
怎么解决?
这里提供3种简单的方案,你可以根据自己的环境选:
方案1:手动替换葡语月份为英文
先把葡语的月份缩写换成Pandas能识别的英文,再指定年份解析:
# 葡语月份到英文的映射表 month_translate = { 'JAN': 'Jan', 'FEV': 'Feb', 'MAR': 'Mar', 'ABR': 'Apr', 'MAI': 'May', 'JUN': 'Jun', 'JUL': 'Jul', 'AGO': 'Aug', 'SET': 'Sep', 'OUT': 'Oct', 'NOV': 'Nov', 'DEZ': 'Dec' } # 替换日期列里的葡语月份 df['Data'] = df['Data'].replace(month_translate, regex=True) # 解析日期,指定你需要的年份(比如2024,根据实际情况改) df['Data'] = pd.to_datetime(df['Data'], format='%d %b', year=2024)
方案2:直接给日期加年份再解析
如果觉得替换月份麻烦,也可以直接在每个日期后面拼上你要的年份,再解析:
# 给每个日期字符串加上年份(比如2024) df['Data'] = df['Data'] + ' 2024' # 按完整的日-月-年格式解析 df['Data'] = pd.to_datetime(df['Data'], format='%d %b %Y')
方案3:设置系统locale为葡萄牙语
如果你用的系统支持葡萄牙语环境,可以直接设置locale让Pandas识别葡语月份:
import locale import pandas as pd # 注意不同系统的locale名称不一样:Linux/macOS用'pt_PT.UTF-8',Windows用'ptb' try: locale.setlocale(locale.LC_TIME, 'pt_PT.UTF-8') except: locale.setlocale(locale.LC_TIME, 'ptb') # 解析日期并指定年份 df['Data'] = pd.to_datetime(df['Data'], format='%d %b', year=2024)
效果验证
用上面任意一种方法处理后,你的日期列应该会变成2024-07-28、2024-08-04这样的正确格式,那些NaT也会消失啦~
备注:内容来源于stack exchange,提问作者leotricano
相关产品推荐
相关产品推荐

