为何Pandas停止解析mm/dd/yyyy格式的日期字符串?
嘿,我来帮你搞定这个Pandas日期解析的问题!你提到的Pandas似乎停止解析mm/dd/yyyy格式日期的情况,其实并不是官方停止支持了——大概率是日期解析的默认推断逻辑和你的预期不匹配,尤其是当日期里的日大于12时,Pandas会因为无法识别非法月份而报错。下面我针对你给出的三个案例逐个给出解决方案:
Case 1: pd.to_datetime 解析失败
问题核心在于,当你传入像11/13/2017这样的字符串时,Pandas默认的自动推断会把斜杠分隔的日期优先当成dd/mm/yyyy,但13不可能是月份,所以直接报错。解决办法就是显式告诉Pandas日期格式:
import pandas as pd # 用format参数明确指定为月/日/年格式 pd.to_datetime(['05/05/2017', '11/13/2017'], format='%m/%d/%Y')
如果你不确定所有日期的格式,但确定是“月在前、日在后”,也可以用dayfirst=False参数(不过指定format是最稳妥的方式,避免歧义):
pd.to_datetime(['05/05/2017', '11/13/2017'], dayfirst=False)
Case 2: pd.date_range 日期格式问题
你给出的示例代码pd.date_range('1/1/2000', periods=1000)其实默认是可以正常解析的,但如果起始日期是类似11/13/2000这种日大于12的mm/dd/yyyy格式,就会和Case1一样报错。解决方式有两种:
- 显式指定
format参数:
import pandas as pd import numpy as np # 明确告诉Pandas起始日期是月/日/年格式 longer_ts = pd.Series(np.random.randn(1000), index=pd.date_range('11/13/2000', periods=1000, format='%m/%d/%Y'))
- 直接传入
datetime对象,彻底跳过字符串解析环节:
from datetime import datetime import pandas as pd import numpy as np longer_ts = pd.Series(np.random.randn(1000), index=pd.date_range(datetime(2000, 11, 13), periods=1000))
Case 3: Series日期切片问题
从你没写完的代码来看,应该是想用mm/dd/yyyy格式的字符串去切片带datetime索引的Series,结果因为格式解析不匹配导致失败。这里推荐两种可靠的切片方式:
- 直接用
datetime对象切片,完全避免字符串解析歧义:
from datetime import datetime import pandas as pd import numpy as np # 先创建带datetime索引的Series dates = pd.date_range('1/1/2000', periods=1000) longer_ts = pd.Series(np.random.randn(1000), index=dates) # 用datetime对象指定切片范围 slice_result = longer_ts[datetime(2000, 5, 5):datetime(2000, 11, 13)]
- 如果一定要用字符串切片,先把字符串转成标准datetime对象再操作:
# 先将mm/dd/yyyy格式的字符串转成datetime start_date = pd.to_datetime('05/05/2000', format='%m/%d/%Y') end_date = pd.to_datetime('11/13/2000', format='%m/%d/%Y') # 用转换后的datetime对象切片 slice_result = longer_ts[start_date:end_date]
内容的提问来源于stack exchange,提问作者iDrwish
相关产品推荐
相关产品推荐

