You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:01:15