pd.to_datetime无法将字符串转为datetime类型,仍保持object的问题
解决Pandas转换带时区字符串为datetime对象(保留原时区)
问题分析
你遇到的核心问题是:直接使用pd.to_datetime()时,pandas默认不会自动将带时区偏移的字符串(如2018-12-31 17:47:14+01:00)解析为带时区感知的datetime对象,因此列类型始终停留在object;而指定utc=True时,pandas会强制将时间转换为UTC时区,这不符合你保留原时区的需求。
解决方案
根据你的需求(保留原时区而非仅偏移量),推荐两种可行方案:
方案1:指定具体时区名称(推荐,支持夏令时)
CET(欧洲中部时间)对应的标准时区标识符是Europe/Paris,使用这个时区名称可以自动处理夏令时(CET/CEST)的偏移切换:
import pandas as pd df = pd.read_csv('data.csv') # 解析时指定时区为Europe/Paris df['Time (CET)'] = pd.to_datetime(df['Time (CET)'], tz='Europe/Paris')
转换后列的数据类型会变为datetime64[ns, Europe/Paris],既保留了时区信息,又能正确识别夏令时的偏移变化。
方案2:仅保留固定时区偏移
如果你的数据只有固定的+01:00偏移,不需要处理夏令时切换,可以通过指定格式来精准解析:
import pandas as pd df = pd.read_csv('data.csv') # 使用%z匹配时区偏移部分,指定utc=False保留原偏移 df['Time (CET)'] = pd.to_datetime(df['Time (CET)'], format='%Y-%m-%d %H:%M:%S%z', utc=False)
转换后列的类型为datetime64[ns, pytz.FixedOffset(60)],对应固定的+01:00偏移。
为什么原代码无效?
你的初始代码未指定任何时区相关参数,pandas虽然能解析字符串内容,但不会主动将其标记为带时区的datetime对象,因此列类型保持为object;而utc=True参数会强制将解析后的时间转换为UTC时区,所以类型变为datetime64[ns, UTC]。
内容的提问来源于stack exchange,提问作者Matzemia
相关产品推荐
相关产品推荐

