如何用Pandas.read_csv分别解析Date与Timestamp列及设置时区
Pandas多列时间类型分别解析与统一时区设置
问题背景
我使用Pandas-1.1.5版本,若升级可解决问题我可以升级。我知道当CSV文件中只有一个类时间列时,如何将其解析为Timestamp类型,示例代码如下:
df = pd.read_csv('try-timestamp.csv', parse_dates=['tick_time'], date_parser=pd.Timestamp) print(type(df['tick_time'][0]))
但现在我有两个类时间列,一个需要解析为pd.Date类型,另一个需要解析为pd.Timestamp类型,示例数据如下:
sample_day,tick_time,data 2022-09-30,22/09/30 09:15:00.446675655,0.273437500 2022-09-30,22/09/30 09:15:00.951579650,0.189697266
我希望第一列sample_day解析为pd.Date类型,第二列tick_time解析为pd.Timestamp类型,同时为它们设置同一时区信息。
解决方案
一、分列解析时间类型
注:Pandas中无原生pd.Date类型,实际对应datetime.date或仅保留日期部分的pd.Timestamp,以下按需求分别处理:
1. 保留Pandas 1.1.5版本的处理方式
1.1.5版本的read_csv不支持为不同列指定单独解析器,需先读取数据再逐列处理:
import pandas as pd from datetime import date # 读取CSV,暂不解析时间列 df = pd.read_csv('try-timestamp.csv') # 将sample_day转为datetime.date类型 df['sample_day'] = pd.to_datetime(df['sample_day']).dt.date # 将tick_time解析为pd.Timestamp类型,指定格式确保解析准确 df['tick_time'] = pd.to_datetime(df['tick_time'], format='%y/%m/%d %H:%M:%S.%f')
2. 升级到Pandas 1.3+版本的优化方式
升级后可通过converters参数为不同列指定专属解析函数,更高效:
import pandas as pd from datetime import date def parse_sample_day(s): return pd.to_datetime(s).date() def parse_tick_time(s): return pd.to_datetime(s, format='%y/%m/%d %H:%M:%S.%f') df = pd.read_csv( 'try-timestamp.csv', converters={ 'sample_day': parse_sample_day, 'tick_time': parse_tick_time } )
二、设置统一时区信息
注意:datetime.date类型不支持时区属性,若需要带时区的日期标识,建议将sample_day转为带时区的pd.Timestamp(仅保留日期部分),再与tick_time统一时区(以下以Asia/Shanghai时区为例):
import pandas as pd df = pd.read_csv('try-timestamp.csv') # 解析sample_day为带时区的Timestamp(仅日期) df['sample_day'] = pd.to_datetime(df['sample_day']).dt.tz_localize('Asia/Shanghai') # 解析tick_time并设置同一时区 df['tick_time'] = pd.to_datetime(df['tick_time'], format='%y/%m/%d %H:%M:%S.%f').dt.tz_localize('Asia/Shanghai') # 若仍需要datetime.date类型(会丢失时区),可在设置时区后转换 df['sample_day_date'] = df['sample_day'].dt.date
如果tick_time原始数据属于其他时区,可先指定原时区再转换到目标时区:
# 示例:假设tick_time原始为UTC时区,转换到Asia/Shanghai df['tick_time'] = pd.to_datetime(df['tick_time'], format='%y/%m/%d %H:%M:%S.%f')\ .dt.tz_localize('UTC')\ .dt.tz_convert('Asia/Shanghai')
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

