Python创建datetime对象报错:'function' object has no attribute 'utc'
AttributeError: 'function' object has no attribute 'utc' 问题排查与解决
问题场景
尝试用以下代码创建带UTC时区的datetime对象:
from datetime import datetime, timezone, timedelta print(datetime(year, month, day, tzinfo=timezone.utc))
但触发错误:
AttributeError: 'function' object has no attribute 'utc'
已移除可能冲突的import datetime as dt语句,但代码在隔离shell/Jupyter Notebook中可正常运行,仅在项目代码中报错。项目的完整导入语句如下:
import sqlite3 import numpy as np import ast import glob import os import risk_report_creation as rrc import configparser import pandas as pd from dateutil.relativedelta import relativedelta import bbg_api_py as bbg import warnings import win32com.client as win32 from tinyflux import TinyFlux, Point, TimeQuery pd.options.mode.chained_assignment = None from datetime import datetime, timezone, date, timedelta import schedule from pretty_html_table import build_table import pythoncom from functools import reduce from time import sleep from pytz import timezone import random import helper_functions_dashboard from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select from selenium.webdriver.edge.options import Options from selenium.webdriver.edge.service import Service
使用Python版本:3.10.2
报错原因
问题出在同名标识符的覆盖:
- 先从
datetime模块导入了timezone类(该类自带utc属性) - 后续又从
pytz模块导入了timezone函数(pytz的timezone是生成时区对象的工具函数,没有utc属性)
后导入的pytz.timezone覆盖了之前的datetime.timezone,导致代码中访问timezone.utc时,实际是在调用这个函数的utc属性,从而触发错误。
解决方法
方法1:重命名pytz的timezone导入
修改pytz的导入语句,给它一个唯一别名,避免覆盖:
from pytz import timezone as pytz_timezone
后续使用pytz时区功能时,用pytz_timezone('时区名称')调用,原timezone.utc即可正常指向datetime.timezone.utc。
方法2:明确引用datetime的timezone
在使用UTC时区时,直接通过datetime.timezone访问,不受覆盖影响:
print(datetime(year, month, day, tzinfo=datetime.timezone.utc))
方法3:调整导入顺序
把from datetime import datetime, timezone, date, timedelta移到所有导入语句的最后,确保它不会被后续导入覆盖。不过这种方法可靠性较低,后续新增导入时可能再次出现冲突。
内容的提问来源于stack exchange,提问作者Lorenz Weidinger
相关产品推荐
相关产品推荐

