datetime.date与datetime.time处理:塔尔萨时间转IST报错求简洁方案
塔尔萨时区转IST时区的DataFrame时间转换问题
我有一个包含date列和time列的DataFrame,需要将塔尔萨时区的队列时间转换为IST时区。最初编写的代码因datetime.date与str类型无法比较报错,修改类型后又出现datetime.time与timedelta无法相加的错误,现寻求简洁高效的实现方法。
原代码
# converting queue time(TULSA time) to IST for r in range(df.shape[0]): queue_date = df.loc[r,'queue date'] queue_time = df.loc[r,'queue time'] if queue_date<'2022-03-13': ist_time = abs(queue_time + '11:30:00') elif queue_date>'2022-03-13': ist_time = abs(queue_time + '10:30:00') elif queue_date=='2022-03-13': if queue_time>='02:00:00': ist_time = abs(queue_time + '10:30:00') else: ist_time = abs(queue_time + '11:30:00')
报错信息
TypeError: '<' not supported between instances of 'datetime.date' and 'str'
修改后的代码
if queue_date<pd.to_datetime('2022-03-13').date(): ist_time = abs(queue_time + timedelta(hours=11,minutes=30,seconds=0)) elif queue_date>pd.to_datetime('2022-03-13').date(): ist_time = abs(queue_time + timedelta(hours=10,minutes=30,seconds=0)) elif queue_date==pd.to_datetime('2022-03-13').date(): if queue_time>=pd.to_datetime('02:00:00').time(): ist_time = abs(queue_time + timedelta(hours=10,minutes=30,seconds=0)) else: ist_time = abs(queue_time + timedelta(hours=11,minutes=30,seconds=0))
报错信息
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
简洁高效的解决方案
手动判断日期和夏令时不仅容易出错,循环遍历行的效率也极低。推荐使用pandas的矢量化操作结合时区库自动处理转换:
- 合并
date和time列,生成带塔尔萨时区的完整datetime对象 - 直接转换为IST时区,自动处理夏令时差异
import pandas as pd from pytz import timezone # 合并日期和时间列,生成塔尔萨时区的datetime df['tulsa_datetime'] = pd.to_datetime(df['queue date'].astype(str) + ' ' + df['queue time'].astype(str)) # 本地化到塔尔萨所在的美国中部时区,自动推断夏令时模糊时间 df['tulsa_datetime'] = df['tulsa_datetime'].dt.tz_localize(timezone('US/Central'), ambiguous='infer') # 转换为IST时区(印度标准时间) df['ist_datetime'] = df['tulsa_datetime'].dt.tz_convert(timezone('Asia/Kolkata')) # 按需拆分出IST的日期和时间列 df['ist_date'] = df['ist_datetime'].dt.date df['ist_time'] = df['ist_datetime'].dt.time
错误原因说明
- 第一个错误:
datetime.date类型与字符串直接比较,类型不匹配,必须统一为日期类型后再比较 - 第二个错误:
datetime.time对象不支持与timedelta直接相加,只有datetime.datetime对象支持此类时间运算
内容的提问来源于stack exchange,提问作者Soumya Pandey
相关产品推荐
相关产品推荐

