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

如何修复Python代码中strptime()需2参数却传入1个的报错?

解决strptime()参数错误问题

我编写了一段从私有服务器下载数据的Python代码,执行时持续报错:An error occurred: strptime() takes exactly 2 arguments (1 given),代码如下:

from typing import Self
import mysql.connector
from mysql.connector import errorcode
import datetime
import csv
import pandas as pd
import os
from dotenv import load_dotenv

load_dotenv()

class DataBase:
    def __init__(self):
        self.username = os.getenv("")
        self.password = os.getenv("")
        self.endpoint_url = os.getenv("DB_ENDPOINT")
        self.db = os.getenv("DB_NAME")
        self.cnx = None
        self.cursor = None

    def connect(self):
        try:
            self.cnx = mysql.connector.connect(
                user=self.username,
                password=self.password,
                host=self.endpoint_url,
                database=self.db,
            )
            self.cursor = self.cnx.cursor()
        except mysql.connector.Error as err:
            if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
                raise ValueError("Invalid username or password") from err
            elif err.errno == errorcode.ER_BAD_DB_ERROR:
                raise ValueError("Database does not exist") from err
            else:
                raise err

    def close(self):
        if self.cursor:
            self.cursor.close()
        if self.cnx:
            self.cnx.close()

    def execute_query(self, query, params=None):
        if not self.cursor:
            raise ValueError("Database not connected")
        try:
            self.cursor.execute(query, params)
        except mysql.connector.Error as err:
            raise err

    def get_total_record_count(self):
        query = "SELECT COUNT(*) FROM sensordata"
        self.execute_query(query)
        return self.cursor.fetchone()[0]

    def get_filtered_record_count(self, sensor, start_date_str, end_date_str):
        query = "SELECT COUNT(*) FROM sensordata WHERE 1=1 "
        params = []

        if sensor:
            query += "AND SensorID = %s "
            params.append(sensor)

        if start_date_str and end_date_str:
            query += "AND timestamp BETWEEN %s AND %s "
            params.extend([start_date_str, end_date_str])

        self.execute_query(query, params)
        return self.cursor.fetchone()[0]

    def fetch_sensor_data(self, sensor=None, start=0, page_size=10, start_date=None, end_date=None):
        datetime_format = "%Y-%m-%d %H:%M:%S"
        if start_date:
            start_date = start_date.strip()
            try:
                start_date = datetime.datetime.strptime(start_date, datetime_format)
            except ValueError as e:
                raise ValueError(f"Start date is not in the correct format: {e}")

        if end_date:
            end_date = end_date.strip()
            try:
                end_date = datetime.datetime.strptime(end_date, datetime_format)
            except ValueError as e:
                raise ValueError(f"End date is not in the correct format: {e}")

        query = "SELECT * FROM sensordata WHERE 1=1"
        params = []

        if sensor:
            query += " AND SensorID = %s"
            params.append(sensor)

        if start_date and end_date:
            query += " AND timestamp BETWEEN %s AND %s"
            params.extend([start_date, end_date])

        query += " ORDER BY timestamp ASC LIMIT %s OFFSET %s"
        params.extend([page_size, start])

        self.execute_query(query, params)
        rows = self.cursor.fetchall()
        column_names = [desc[0] for desc in self.cursor.description]
        data = [dict(zip(column_names, row)) for row in rows]
        return data

    def export_to_csv(self, file_name, data):
        file_loc = os.path.join(os.getcwd(), file_name)
        with open(file_loc, mode="w", newline="") as sensorfile:
            fieldnames = [
                "SensorID",
                "location",
                "temp",
                "humidity",
                "pm10",
                "pm25",
                "pm100",
                "particles03",
                "timestamp",
            ]
            sensor_write = csv.DictWriter(sensorfile, fieldnames=fieldnames)
            sensor_write.writeheader()

            for row in data:
                sensor_write.writerow(row)

if __name__ == "__main__":
    db_info = DataBase()
    try:
        db_info.connect()
        data = db_info.fetch_sensor_data(
            sensor="PMTL_sensor1",
            start_date="2023-11-25 23:10:00", 
            end_date="2023-12-03 05:30:00",
            start=0, 
            page_size=100)
        db_info.export_to_csv("PMTL_sensor1.csv", data)
    except Exception as e:
        print(f"An error occurred: {e}")
    finally:
        db_info.close()

错误原因

报错明确说明调用strptime()时只传递了1个参数,但该方法需要2个必填参数:日期字符串和格式字符串。结合代码来看,问题出在datetime模块的调用层级上——你使用import datetime导入整个模块,因此需要通过datetime.datetime.strptime()调用方法,但如果代码运行时出现层级混淆(比如误改导入方式或变量覆盖),就会导致参数传递异常。

修复方案

方案1:修正导入和调用方式

将datetime模块的导入改为直接导入datetime类,避免层级混淆:

  1. 修改导入语句:
# 替换原来的 import datetime
from datetime import datetime
  1. 修改fetch_sensor_data方法中的两处strptime调用:
# 处理start_date
start_date = datetime.strptime(start_date, datetime_format)

# 处理end_date
end_date = datetime.strptime(end_date, datetime_format)

方案2:确保模块调用层级正确

如果坚持使用import datetime,则必须确保所有调用都保持datetime.datetime.strptime(日期字符串, 格式字符串)的层级,同时检查代码中是否有变量名datetime覆盖了模块名(比如不要定义名为datetime的变量)。

额外修复点

注意你的__init__方法中,self.username和self.password的环境变量名是空字符串,需要改为对应的环境变量名,比如:

self.username = os.getenv("DB_USER")
self.password = os.getenv("DB_PASSWORD")

否则数据库连接会因缺少账号密码失败。

内容的提问来源于stack exchange,提问作者AbdulBani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:14:55