zt:python下datetime类型的转换

本文介绍Python中datetime类型转换的方法,重点讲解如何使用strptime函数将字符串转换为datetime对象,并列出常用的格式化指令。

zt:python下datetime类型的转换

2010/8/4 12:37:18
print datetime.strptime("2010-04-01 00:04:57.277","%Y-%m-%d %H:%M:%S.%f")
参考文章:
http://docs.python.org/library/datetime.html#strftime-strptime-behavior
DirectiveMeaningNotes
%aLocale’s abbreviated weekday name. 
%ALocale’s full weekday name. 
%bLocale’s abbreviated month name. 
%BLocale’s full month name. 
%cLocale’s appropriate date and time representation. 
%dDay of the month as a decimal number [01,31]. 
%fMicrosecond as a decimal number [0,999999], zero-padded on the left(1)
%HHour (24-hour clock) as a decimal number [00,23]. 
%IHour (12-hour clock) as a decimal number [01,12]. 
%jDay of the year as a decimal number [001,366]. 
%mMonth as a decimal number [01,12]. 
%MMinute as a decimal number [00,59]. 
%pLocale’s equivalent of either AM or PM.(2)
%SSecond as a decimal number [00,61].(3)
%UWeek number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0.(4)
%wWeekday as a decimal number [0(Sunday),6]. 
%WWeek number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0.(4)
%xLocale’s appropriate date representation. 
%XLocale’s appropriate time representation. 
%yYear without century as a decimal number [00,99]. 
%YYear with century as a decimal number. 
%zUTC offset in the form +HHMM or -HHMM (empty string if the the object is naive).(5)
%ZTime zone name (empty string if the object is naive). 
%%A literal '%' character.
class RequirementPool(BaseModel): """ Product需求明细主模型:存储需求池的基本信息 """ id: Annotated[int | None, Field(description="主键(自动生成)")] = None project_no: Annotated[str | None, Field(alias="projectNo", max_length=20, description="项目编号")] = None req_name: Annotated[str | None, Field( alias="reqName", description="需求名称")] = None equip: Annotated[str | None, Field( max_length=100, description="产品名称")] = None req_sub_date: Annotated[datetime | None, Field( alias="reqSubDate", description="需求提交日期")] = None zt_id: Annotated[int, Field(alias="ztId", description="需求编号")] = None estimated_finish_date: Annotated[datetime | None, Field(alias="estimatedFinishDate", description="预估实现时间")] = None req_dev_leader: Annotated[str | None, Field(alias="reqDevLeader", max_length=100, description="开发负责人")] = None rd_req_datas: Annotated[List[RDReqData] | None, Field(alias="rdReqDatas", description="关联的 RDReqData 列表")] = None associated_version: Annotated[str | None, Field(alias="associatedVersion", max_length=255, description="关联版本号")] = None associated_version_id: Annotated[int | None, Field(alias="associatedVersionId", max_length=255, description="关联版本id")] = None release_date: Annotated[datetime | None, Field(alias="releaseDate",description="发布日期(未发布 或 具体日期)")] = None requirement_status: Annotated[str | None, Field(alias="requirementStatus", max_length=20, description="需求状态")] = None software_project: Annotated[str | None, Field(alias="softwareProject", max_length=1050, description="所属软件项目")] = None rd_req_id: Annotated[int | None, Field( alias="rdReqid", description="研发需求ID")] = None class Config: from_attributes = True extra = 'allow' 处理这个模型 时间字段要求是 北京时间
08-26
-- coding: utf-8 -- “”" @file: async_zt_flow_hcproblem @author: maxiaolong01 @date: 2025/7/17 10:14 “”" import datetime import pprint from tortoise import run_async from app.models.product import RequirementPool from app.settings import TORTOISE_ORM from app.utils.db import MySqlClient estimated_finish_date = datetime.date(1971, 1, 1) async def get_zt_materiallib(sql: str = ‘select * from zt_materiallib’): result = {} async with MySqlClient(TORTOISE_ORM) as client: for item in await client.execute_query(sql): release_date = item.get( “releaseDate”, datetime.date( 1971, 1, 1)) result["release_date"] = str(release_date) result["software_project"] = item.get("name", "未关联") print("release_date:", release_date, datetime.date( 1971, 1, 1)) if release_date == datetime.date( 1971, 1, 1): result["requirement_status"] = "超期未关闭" if datetime.date.today( ) > estimated_finish_date else "按期未关闭" print("requirement_status:", datetime.date.today(), estimated_finish_date, result["requirement_status"]) else: result["requirement_status"] = "按期关闭" if release_date < estimated_finish_date else "超期关闭" print("requirement_status:", release_date, estimated_finish_date, result["requirement_status"]) return result async def get_zt_build(sql: str = ‘select * from zt_build’): result = {} async with MySqlClient(TORTOISE_ORM) as client: for item in await client.execute_query(sql): associated_version = item.get(“name”, “未关联”) result[“associated_version”] = associated_version result[“associated_version_id”] = item.get(“id”, 0) sql = f""" SELECT m.releaseDate,p.name FROM zt_materiallib m LEFT JOIN zt_project p ON p.id = m.project WHERE m.topubbaseline = '{associated_version}' AND m.status = '1' LIMIT 1 """ d = await get_zt_materiallib(sql) if not d: d["release_date"] = str(datetime.date( 1971, 1, 1)) d["software_project"] = "未关联" d["requirement_status"] = "超期未关闭" if datetime.date.today( ) > estimated_finish_date else "按期未关闭" print("requirement_status:", datetime.date.today(), estimated_finish_date, d["requirement_status"]) result.update(d) return result async def get_zt_hctransform(sql: str = ‘select * from zt_hctransform where fromid = 1 and type = “hcrequirementtostory”’): result = [] async with MySqlClient(TORTOISE_ORM) as client: transformid = None for item in await client.execute_query(sql): transformid = item.get(“transformid”) sql = f"“” SELECT * FROM zt_build WHERE stories LIKE ‘%{transformid}%’ AND deleted = ‘0’ ORDER BY id DESC LIMIT 1 “”" build_data = await get_zt_build(sql) if not build_data: build_data.update({ “rd_req_id”: 0, “release_date: str(datetime.date( 1971, 1, 1)), “software_project”: “未关联”, “requirement_status”:“超期未关闭” if datetime.date.today( ) > estimated_finish_date else “按期未关闭” }) else: build_data.update({“rd_req_id”: transformid}) result.append(build_data) return result async def get_zt_flow_hcrequirement_item(sqlfile: str = ‘./app/tasks/sql/zt_flow_hcrequirement.sql’): result = [] global estimated_finish_date with open(sqlfile, ‘r’, encoding=‘utf-8’) as f: sql = f.read() async with MySqlClient(TORTOISE_ORM) as client: for item in await client.execute_query(sql): fromid = item.get(“zt_id”) sql = f’select * from zt_hctransform where fromid = {fromid} and type = “hcrequirementtostory”’ print(sql) estimated_finish_date = datetime.date.fromisoformat(item.get( “estimated_finish_date”, “1971-01-01”)) rd_req_data_list = await get_zt_hctransform(sql) data = {"" "zt_id": item.get("zt_id"), "project_no": item.get("project_no"), "equip": item.get("equip"), "req_name": item.get("req_name"), "req_sub_date": datetime.datetime.strptime(item.get("req_sub_date", "1971-01-01"), '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S'), "estimated_finish_date": datetime.datetime.strptime(item.get("estimated_finish_date", "1971-01-01"), '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S'), "req_dev_leader": item.get("req_dev_leader") } # pprint.pprint(item) # pool, _ = await RequirementPool.update_or_create(**data) rd_red_data = [] for i in rd_req_data_list: d = { "associated_version": i.get("associated_version", "未关联"), "associated_version_id": i.get("associated_version_id", 0), "rd_req_id": i.get("rd_req_id", None), "release_date": i.get("release_date", datetime.datetime.strptime("1971-01-01", '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S')), "requirement_status": i.get("requirement_status", "未关闭"), "software_project": i.get("software_project", "未关联"), } data.update(d) print(data) rd_red_data.append(RequirementPool(**data)) if rd_red_data: print(rd_red_data) await RequirementPool.bulk_create(rd_red_data) # await RDReqData.bulk_create(rd_red_data) async def insert_product_requirement_pool(): await get_zt_flow_hcrequirement_item() if name == ‘main’: run_async(get_zt_flow_hcrequirement_item()) 再造成分批并发同步 展示优化后的全部代码
09-05
# -*- coding: utf-8 -*- """ @file: async_zt_flow_hcproblem @author: maxiaolong01 @date: 2025/7/17 10:14 """ import datetime import pprint from tortoise import run_async from app.models.product import RequirementPool from app.settings import TORTOISE_ORM from app.utils.db import MySqlClient estimated_finish_date = datetime.date(1971, 1, 1) async def get_zt_materiallib(sql: str = 'select * from zt_materiallib'): result = {} async with MySqlClient(TORTOISE_ORM) as client: for item in await client.execute_query(sql): release_date = item.get( "releaseDate", datetime.date( 1971, 1, 1)) result["release_date"] = str(release_date) result["software_project"] = item.get("name", "未关联") print("release_date:", release_date, datetime.date( 1971, 1, 1)) if release_date == datetime.date( 1971, 1, 1): result["requirement_status"] = "超期未关闭" if datetime.date.today( ) > estimated_finish_date else "按期未关闭" print("requirement_status:", datetime.date.today(), estimated_finish_date, result["requirement_status"]) else: result["requirement_status"] = "按期关闭" if release_date < estimated_finish_date else "超期关闭" print("requirement_status:", release_date, estimated_finish_date, result["requirement_status"]) return result async def get_zt_build(sql: str = 'select * from zt_build'): result = {} async with MySqlClient(TORTOISE_ORM) as client: for item in await client.execute_query(sql): associated_version = item.get("name", "未关联") result["associated_version"] = associated_version result["associated_version_id"] = item.get("id", 0) sql = f""" SELECT m.releaseDate,p.name FROM zt_materiallib m LEFT JOIN zt_project p ON p.id = m.project WHERE m.topubbaseline = '{associated_version}' AND m.status = '1' LIMIT 1 """ d = await get_zt_materiallib(sql) if not d: d["release_date"] = str(datetime.date( 1971, 1, 1)) d["software_project"] = "未关联" d["requirement_status"] = "超期未关闭" if datetime.date.today( ) > estimated_finish_date else "按期未关闭" print("requirement_status:", datetime.date.today(), estimated_finish_date, d["requirement_status"]) result.update(d) return result async def get_zt_hctransform(sql: str = 'select * from zt_hctransform where fromid = 1 and type = "hcrequirementtostory"'): result = [] async with MySqlClient(TORTOISE_ORM) as client: transformid = None for item in await client.execute_query(sql): transformid = item.get("transformid") sql = f""" SELECT * FROM `zt_build` WHERE `stories` LIKE '%{transformid}%' AND deleted = '0' ORDER BY id DESC LIMIT 1 """ build_data = await get_zt_build(sql) if not build_data: build_data.update({ "rd_req_id": 0, "release_date": str(datetime.date( 1971, 1, 1)), "software_project": "未关联", "requirement_status":"超期未关闭" if datetime.date.today( ) > estimated_finish_date else "按期未关闭" }) else: build_data.update({"rd_req_id": transformid}) result.append(build_data) return result async def get_zt_flow_hcrequirement_item(sqlfile: str = './app/tasks/sql/zt_flow_hcrequirement.sql'): result = [] global estimated_finish_date with open(sqlfile, 'r', encoding='utf-8') as f: sql = f.read() async with MySqlClient(TORTOISE_ORM) as client: for item in await client.execute_query(sql): fromid = item.get("zt_id") sql = f'select * from zt_hctransform where fromid = {fromid} and type = "hcrequirementtostory"' print(sql) estimated_finish_date = datetime.date.fromisoformat(item.get( "estimated_finish_date", "1971-01-01")) rd_req_data_list = await get_zt_hctransform(sql) data = {"" "zt_id": item.get("zt_id"), "project_no": item.get("project_no"), "equip": item.get("equip"), "req_name": item.get("req_name"), "req_sub_date": datetime.datetime.strptime(item.get("req_sub_date", "1971-01-01"), '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S'), "estimated_finish_date": datetime.datetime.strptime(item.get("estimated_finish_date", "1971-01-01"), '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S'), "req_dev_leader": item.get("req_dev_leader") } # pprint.pprint(item) # pool, _ = await RequirementPool.update_or_create(**data) rd_red_data = [] for i in rd_req_data_list: d = { "associated_version": i.get("associated_version", "未关联"), "associated_version_id": i.get("associated_version_id", 0), "rd_req_id": i.get("rd_req_id", None), "release_date": i.get("release_date", datetime.datetime.strptime("1971-01-01", '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S')), "requirement_status": i.get("requirement_status", "未关闭"), "software_project": i.get("software_project", "未关联"), } data.update(d) print(data) rd_red_data.append(RequirementPool(**data)) if rd_red_data: print(rd_red_data) await RequirementPool.bulk_create(rd_red_data) # await RDReqData.bulk_create(rd_red_data) async def insert_product_requirement_pool(): await get_zt_flow_hcrequirement_item() if __name__ == '__main__': run_async(get_zt_flow_hcrequirement_item()) 性能优化注意逻辑正确
最新发布
09-05
# -*- coding: utf-8 -*- """ @file: async_zt_flow_hcproblem @author: maxiaolong01 @date: 2025/7/17 10:14 """ import datetime import asyncio import time from tortoise import run_async from tortoise.transactions import in_transaction from app.models.product import RequirementPool from app.settings import TORTOISE_ORM from app.utils.db import MySqlClient BATCH_SIZE = 50 # 每批处理的项目数量 CONCURRENCY_LIMIT = 10 # 最大并发任务数 TIMING_DATA = {} # 存储各阶段耗时统计 class OptimizedMySqlClient: """增强版MySQL客户端(连接池管理)""" def __init__(self): self.pool = None async def initialize_pool(self): """初始化连接池""" if not self.pool: self.pool = await MySqlClient.create_pool(TORTOISE_ORM) print(f"连接池初始化完成: 最大连接数={self.pool.maxsize}") return self.pool async def execute_query(self, sql: str): """使用连接池执行查询""" async with self.pool.acquire() as conn: async with conn.cursor() as cursor: await cursor.execute(sql) return await cursor.fetchall() async def close_pool(self): """关闭连接池""" if self.pool: await self.pool.close() self.pool = None print("数据库连接池已关闭") # 全局单例客户端 mysql_client = OptimizedMySqlClient() async def get_zt_materiallib(sql: str, estimated_date: datetime.date) -> dict: """获取物料库信息(使用共享连接池)""" start_time = time.perf_counter() results = {} for item in await mysql_client.execute_query(sql): release_date = item.get("releaseDate", datetime.date(1971, 1, 1)) status = "按期关闭" if release_date <= estimated_date else "超期关闭" results[item["id"]] = { "release_date": str(release_date), "software_project": item.get("name", "未关联"), "requirement_status": status } TIMING_DATA.setdefault('materiallib', []).append( time.perf_counter() - start_time) return results async def get_zt_build(build_id: int, estimated_date: datetime.date) -> dict: """获取构建信息(使用共享连接池)""" start_time = time.perf_counter() sql = f""" SELECT b.id, b.name, m.releaseDate, p.name AS project_name FROM zt_build b LEFT JOIN zt_materiallib m ON m.topubbaseline = b.name AND m.status = '1' LEFT JOIN zt_project p ON p.id = m.project WHERE b.id = {build_id} """ items = await mysql_client.execute_query(sql) if not items: status = "超期未关闭" if datetime.date.today() > estimated_date else "按期未关闭" result = { "associated_version": "未关联", "associated_version_id": build_id, "release_date": str(datetime.date(1971, 1, 1)), "software_project": "未关联", "requirement_status": status } else: item = items[0] release_date = item.get("releaseDate", datetime.date(1971, 1, 1)) status = "按期关闭" if release_date <= estimated_date else "超期关闭" result = { "associated_version": item.get("name", "未关联"), "associated_version_id": build_id, "release_date": str(release_date), "software_project": item.get("project_name", "未关联"), "requirement_status": status } TIMING_DATA.setdefault('build', []).append( time.perf_counter() - start_time) return result async def process_transformation(transform_id: int, estimated_date: datetime.date) -> dict: """处理需求转换(使用共享连接池)""" start_time = time.perf_counter() sql = f""" SELECT id, stories FROM zt_build WHERE stories LIKE '%{transform_id}%' AND deleted = '0' ORDER BY id DESC LIMIT 1 """ builds = await mysql_client.execute_query(sql) if not builds: status = "超期未关闭" if datetime.date.today() > estimated_date else "按期未关闭" result = { "rd_req_id": transform_id, "release_date": str(datetime.date(1971, 1, 1)), "software_project": "未关联", "requirement_status": status } else: build_id = builds[0].get("id") build_data = await get_zt_build(build_id, estimated_date) build_data["rd_req_id"] = transform_id result = build_data TIMING_DATA.setdefault('transformation', []).append( time.perf_counter() - start_time) return result async def process_requirement_item(item): """处理单个需求项(使用事务批量提交)""" start_time = time.perf_counter() estimated_date = datetime.date.fromisoformat( item.get("estimated_finish_date", "1971-01-01")) transform_sql = f'SELECT * FROM zt_hctransform WHERE fromid = {item["zt_id"]} AND type = "hcrequirementtostory"' transforms = await mysql_client.execute_query(transform_sql) transform_tasks = [process_transformation( t["transformid"], estimated_date) for t in transforms] transform_results = await asyncio.gather(*transform_tasks) base_data = { "zt_id": item["zt_id"], "project_no": item["project_no"], "equip": item["equip"], "req_name": item["req_name"], "req_sub_date": datetime.datetime.strptime( item.get("req_sub_date", "1971-01-01"), '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S'), "estimated_finish_date": datetime.datetime.strptime( item.get("estimated_finish_date", "1971-01-01"), '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S'), "req_dev_leader": item["req_dev_leader"] } requirement_data = [] for transform in transform_results: req_data = { **base_data, "associated_version": transform.get("associated_version", "未关联"), "associated_version_id": transform.get("associated_version_id", 0), "rd_req_id": transform.get("rd_req_id"), "release_date": transform.get("release_date"), "requirement_status": transform.get("requirement_status", "未关闭"), "software_project": transform.get("software_project", "未关联") } requirement_data.append(RequirementPool(**req_data)) # 使用事务批量创建 if requirement_data: async with in_transaction() as connection: await RequirementPool.bulk_create(requirement_data, using_db=connection) TIMING_DATA.setdefault('item', []).append(time.perf_counter() - start_time) return len(requirement_data) async def process_requirement_batch(item_batch: list): """批量处理需求项(带连接池的健康检查)""" batch_start = time.perf_counter() semaphore = asyncio.Semaphore(CONCURRENCY_LIMIT) async def process_with_semaphore(item): async with semaphore: return await process_requirement_item(item) results = await asyncio.gather(*[process_with_semaphore(item) for item in item_batch]) batch_time = time.perf_counter() - batch_start TIMING_DATA.setdefault('batch', []).append({ 'batch_size': len(item_batch), 'processing_time': batch_time, 'items_processed': sum(results) }) async def get_zt_flow_hcrequirement_item(sqlfile: str = './app/tasks/sql/zt_flow_hcrequirement.sql'): """主处理函数(含连接池生命周期管理)""" global TIMING_DATA TIMING_DATA = {'total_start': time.perf_counter()} # 初始化连接池 await mysql_client.initialize_pool() with open(sqlfile, 'r', encoding='utf-8') as f: sql = f.read() all_items = await mysql_client.execute_query(sql) TIMING_DATA['total_items'] = len(all_items) # 分批处理并计时 for i in range(0, len(all_items), BATCH_SIZE): batch = all_items[i:i + BATCH_SIZE] await process_requirement_batch(batch) TIMING_DATA['total_end'] = time.perf_counter() TIMING_DATA['total_duration'] = TIMING_DATA['total_end'] - \ TIMING_DATA['total_start'] # 打印详细耗时报告 print("\n===== 并发执行耗时报告 =====") print(f"总处理项: {TIMING_DATA['total_items']}") print(f"总耗时: {TIMING_DATA['total_duration']:.4f}秒") # 连接池使用统计 if mysql_client.pool: pool_stats = { 'size': mysql_client.pool.size, 'free': mysql_client.pool.freesize, 'used': mysql_client.pool.size - mysql_client.pool.freesize } print( f"连接池状态: 总数={pool_stats['size']} 使用中={pool_stats['used']} 空闲={pool_stats['free']}") # 关闭连接池 await mysql_client.close_pool() async def insert_product_requirement_pool(): """入口函数(含连接池管理)""" await get_zt_flow_hcrequirement_item() if __name__ == '__main__': # 完整执行流程 start_time = time.time() print("任务开始执行...") run_async(insert_product_requirement_pool()) print(f"任务总执行时间: {time.time() - start_time:.2f}秒") 优化这个脚本 MySqlClient 不用
09-05
Traceback (most recent call last): File "D:\dev\EquipmentRegistryDataPlatform\venv\lib\site-packages\iso8601\iso8601.py", line 122, in parse_date m = ISO8601_REGEX.match(datestring) TypeError: expected string or bytes-like object During handling of the above exception, another exception occurred: Traceback (most recent call last): File "d:\dev\EquipmentRegistryDataPlatform\app\tasks\async_zt_flow_hcproblem.py", line 62, in <module> run_async(insert_zt_flow_hcproblem()) File "D:\dev\EquipmentRegistryDataPlatform\venv\lib\site-packages\tortoise\__init__.py", line 643, in run_async loop.run_until_complete(coro) File "C:\Program Files\Python310\lib\asyncio\base_events.py", line 649, in run_until_complete return future.result() File "d:\dev\EquipmentRegistryDataPlatform\app\tasks\async_zt_flow_hcproblem.py", line 57, in insert_zt_flow_hcproblem bulk_data.append(ZtFlowHcProblem(**data)) File "D:\dev\EquipmentRegistryDataPlatform\venv\lib\site-packages\tortoise\models.py", line 698, in __init__ for key in meta.fields.difference(self._set_kwargs(kwargs)): File "D:\dev\EquipmentRegistryDataPlatform\venv\lib\site-packages\tortoise\models.py", line 736, in _set_kwargs setattr(self, key, field_object.to_python_value(value)) File "D:\dev\EquipmentRegistryDataPlatform\venv\lib\site-packages\tortoise\fields\data.py", line 358, in to_python_value value = parse_datetime(value) File "D:\dev\EquipmentRegistryDataPlatform\venv\lib\site-packages\iso8601\iso8601.py", line 124, in parse_date raise ParseError(e) iso8601.iso8601.ParseError: expected string or bytes-like object
08-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值