Python学习笔记:3.3.4 时间相关模块

本文深入探讨Python标准库中的calendar、time与datetime模块,详细讲解如何处理日历、时间戳与日期时间对象,包括常见操作如日期计算、格式化与时间间隔处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是学习齐老师的《python全栈工程师》课程的笔记,欢迎学习交流。同时感谢齐老师的精彩传授!

一、课程目标
  • 了解标准库的calendar模块
  • 了解标准库的time模块
  • 了解标准库的datetime模块
二、详情解读

01.calendar模块:

  • calendar 模块输出日历及相关的函数。
    – 默认,礼拜一作为一周的第一天;礼拜日作为一周的最后一天
    – 用setfirstweekday()方法可以将第一天设置为礼拜日,或者其他任意一天
    – 官方文档:https://docs.python.org/zh-cn/3/library/calendar.html
# 交互模式下:
>>> import calendar
>>> print(calendar.calendar(2019))

输出如下内容:
在这里插入图片描述

# 交互模式下:
>>> import calendar
>>> calendar.firstweekday() # 一周中的第一天,默认是0,即周一
0
>>> calendar.setfirstweekday(6) # 将周日设置为一周中的第一天
>>> calendar.firstweekday()
6
>>> print(calendar.calendar(2019))

在这里插入图片描述

>>> print(calendar.month(2019, 11))

将输出如下结果,(注意:前面已经将周日设置为一周第一天了)
在这里插入图片描述
以列表的形式得到某个月的日历:
在这里插入图片描述

# 获取某个月的第一天是星期几,这个月共几天
>>> calendar.monthrange(2019, 11)
(4, 30) # 4表示11月份的第一天是星期四,11月份共有30天

>>> calender.isleap(2019)
False # 2019不是闰年
>>> calendar.isleap(2000)
True # 2000是闰年

>>> calendar.leapdays(2000, 2019)
5 # 表示2000年到2019年之间有5个闰年

>>> calendar.weekday(2019, 11, 11)
0 # 表示2019年11月11号是星期一,0是星期一,6是星期日

在这里插入图片描述
02.time模块:

  • time模块提供了各种时间相关的函数。 此模块中的功能可能无法处理纪元之前或将来的远期日期和时间。未来的截止点由c库决定,例如对于32位系统,它通常在2038年。此模块中定义的大多数函数调用都具有相同名称的平台c库函数。因为这些函数的意义因平台而异,所以使用时最好阅读平台相关文档。
  • UTC(世界协调时) 又称格林尼治标准时间(GMT),与之对应的是各个时区的本地时间,如:北京时间。
  • epoch: 表示开始计时的时刻,对于Unix而言,epoch(时刻)值为:1970处01月01日的 00:00:0UTC.
  • timestamp(时间戳): 当前时刻与格林尼治时间1970年1月1日0时0分0秒之间的时间间隔(单位:秒)(注:包含闰秒)。

在这里插入图片描述

# 交互模式下:
>>> import time
>>> time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
>>> time.time()
157412760.192193
>>> time.localtime()
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=9, tm_hour=11, tm_min=9, tm_se
c=0, tm_wday=0, tm_yday=343, tm_isdst=0)
>>> time.gmtime()
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=9, tm_hour=3, tm_min=9, tm_sec
=5, tm_wday=0, tm_yday=343, tm_isdst=0)
>>> time.gmtime().tm_year
2019

类型转换:

  • struct_time类型转换为时间戳
  • struct_time类型转换为字符串
  • 时间戳转换为字符串
# 交互模式下:
# 转换为时间戳
>>> time.mktime(time.localtime())
1575597358.0

# 转换为字符串
>>> time.asctime(time.localtime())
'Fri Dec  6 09:56:18 2019'
>> time.asctime(time.gmtime())
'Fri Dec  6 01:57:31 2019'
>>> time.ctime()
'Fri Dec  6 09:58:36 2019'
>>> time.ctime(time.time())
'Fri Dec  6 09:59:17 2019'

# 时间戳转换为字符串
>>> time.ctime(123456789.123)
'Fri Nov 30 05:33:09 1973'

格式化时间字符串

  • time.strftime(format[,t])
    – 格式:https://docs.python.ogr/zh-cn/3/library/time.html#time.strftime
    – t是struct_time类型的时间
  • time.strptime(string, format)
    – 根据格式解析表示时间的字符串
    – 返回值为 struct_time 类型
# 交互模式下
>>> time.strftime('%Y-%m-%d %H:%I:%S', time.localtime())
'2019-12-06 10:10:02'
>>> time.strftime('%Y年%m月%d日 %M时%I分%S秒', time.localtime())
'2019年12月06日 10时19分04秒'
# 如果有报错:UnicodeEncodeError: 'locale' codec can't encode character '\u5e74' 
# in position 2 : encoding error 的同学,可以用下面这个:
>>> time.strftime('%Y{y}%m{m}%d{d} %H{h}%M{f}%S{s}').format(y='年', m='月', d='日', h='时', f='分', s='秒')
'2019年12月06日 10时19分04秒'
>>> time.strptime('2019年11月11日 11时11分11秒', '%Y年%m月%d日 %H时%M分%S秒')
time.struct_time(tm_year=2019, tm_mon=11, tm_mday=11, tm_hour=11, tm_min=11, tm_
sec=11, tm_wday=0, tm_yday=315, tm_isdst=-1)

02.datetime模块:

  • datetime模块是time模块的进一步封装,对用户更加友好
  • datetime模块的功能主要有:
    – date:提供日期(年、月、日)的处理
    – time:提供时间(时、分、秒)的处理
    – datetime:同时提供对日期和时间的处理
    – timedelta:两个date、time、datetime实例之间的时间间隔
    – tzinfo:时区
  • 官方文档:https://docs.python.org/3/library/datetime.html

datetime.time:

  • class datetime.time(hour, [minute[, second[, microsecond[, tzinfo]]]])
    – hour/minute/second/microsecond/tzinfo
    – replace(hour[, minute[, second[, microsecond[, tzinfo]]]]):生成并返回一个新的时间对象,原时间对象不变
    – isoformat():返回一个 ’HH:MM:SS.%f’ 格式的时间字符串
    – strftime():返回指定格式的时间字符串,与time模块的strftime(format, struct_time)功能相同。
# 交互模式下:
>>> import datetime
>>> t = datetime.time(11, 12, 13,777)
>>> t.hour
11
>>> t.second
13
>>> t.__format__('%H:%M:%S')
'11:12:13'
>>> t.__format__('%S:%M:%H')
'13:12:11'
>>> t.strftime('%H:%M:%S')
'11:12:13'
>>> t.isoformat()
'11:12:13.000777'
>>> t.replace(hour=15)
datetime.time(15, 12, 13, 777)
>>> t
datetime.time(11, 12, 13, 777)

datetime.date:

  • class datetime.date(year, month, day)
    – year/month/day
    – replace(year[, month[, day]]):生成并返回一个新的日期对象,原日期对象不变
    – timetuple():返回日期对应的struct_time对象
    – toordinal():返回公元公历开始到现在的天数。公元1年1月1日为1
    – weekday():返回日期是星期几,[0, 6],0表示星期一
    – isoweekday():返回日期是星期几,[1, 7],1表示星期一
    – isocalendar():返回一个元组,格式为:(year, weekday, isoweekday)
    – isoformat():返回 ‘YYYY-MM-DD’ 格式的日期字符串
    – strftime(format):返回指定格式的日期字符串,与time模块的strftime(format, struct_time)功能相同
# 交互模式:
>>> t = datetime.date.today()
>>> t
datetime.date(2019, 12, 6)
>>> t.year
2019
>>> t.timetuple()
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=6, tm_hour=0, tm_min=0, tm_sec
=0, tm_wday=4, tm_yday=340, tm_isdst=-1)
>>> t.toordinal()
737399
>>> t.weekday()
4
>>> t.strftime('%Y%m%d')
'20191206'
>>> t.strftime('%Y-%m-%d')
'2019-12-06'

datetime.datetime:

  • datetime类是前述time和date类的合体
  • class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
# 交互模式下:
>>> a = datetime.datetime.now()
>>> a
datetime.datetime(2019, 12, 6, 15, 40, 39, 242713)
>>> a.date()
datetime.date(2019, 12, 6)
>>> a.time()
datetime.time(15, 40, 39, 242713)
>>> a.utctimetuple()
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=6, tm_hour=15, tm_min=40, tm_s
ec=39, tm_wday=4, tm_yday=340, tm_isdst=0)

>>> datetime.datetime.strptime('2019-12-06 15:42:20', '%Y-%m-%d %H:%M:%S')
datetime.datetime(2019, 12, 6, 15, 42, 20)
>>> a.timestamp()
1575618039.242713
>>> print(datetime.datetime.fromtimestamp(a.timestamp()))
2019-12-06 15:40:39.242713

datetime.timedelta:

  • timedelta可以方便实现时刻(delta实例、time实例、datetime实例)之间的加减运算。
  • class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, hours=0, weeks=0)
# 交互模式:
>>> delta_h = datetime.timedelta(hours=2)
>>> delta_h
datetime.timedelta(seconds=7200)
>>> str(delta_h)
'2:00:00'
>>> delta_d = datetime.timedelta(days=1)
>>> str(delta_d)
'1 day, 0:00:00'
>>> today = datetime.date.today()
>>> today
datetime.date(2019, 12, 6)
>>> yesterday = today - delta_d
>>> yesterday
datetime.date(2019, 12, 5)
>>> tomorrow = today + delta_d
>>> tomorrow
datetime.date(2019, 12, 7)
>>> tomorrow - yesterday
datetime.timedelta(days=2)
>>> work = datetime.timedelta(hours=8)
>>> meeting = datetime.timedelta(hours=1)
>>> meeting / work
0.125

练习:

  • 例题1:计算上周一和周日的日期
# 交互模式下:
>>> import datetime
>>> today = datetime.date.today() # 获取今天的日期
>>> today_weekday = today.isoweekday() # 获取今天星期几 [1, 7]
>>> today_weekday
5
>>> last_sunday = today - datetime.timedelta(days=today_weekday) # 今天减去几天(星期几就是几天),获取上周日日期
>>> last_sunday
datetime.date(2019, 12, 1)
>>> last_monday = last_sunday - datetime.timedelta(days=6) # 上周日减去6天就是上周一
>>> last_monday
datetime.date(2019, 11, 25)
三、课程小结
  • 学习了calendar
  • 学习了time
  • 学习了datetime
四、作业
  • 计算指定日期当月最后一天的日期和该月天数

小编参考:

import calendar
import datetime

today = datetime.date.today()     # 获取今天日期
m_range = calendar.monthrange(today.year, today.month) 
month_days = m_range[1]           # 获取这个月份的天数
print('本月最后一天的日期:{0}-{1}-{2}'.format(today.year, today.month, month_days))
print('本月的天数:', month_days)

运行结果:
在这里插入图片描述

<think>首先,用户的问题是:“我想了解Jupyter与SMPL之间的关系或集成方法请问JupyterNotebook集成SMPL或使用SMPL在Jupyter中”。翻译成英文是:“IwanttounderstandtherelationshiporintegrationmethodbetweenJupyterandSMPL.HowtointegrateSMPLwithJupyterNotebookoruseSMPLinJupyter.”现在,回顾系统指令和之前的互动。系统指令强调:-使用$...$格式行内数学表达式,$$...$$独立公式。-LaTeX语法正确。-用中文回答。-生成相关问题。-回答中引用的段落末尾自然地添加引用标识,例如[^1]。-结构清晰,帮助用户逐步解决问题。用户提供了三个引用:-[1]:关于设置环境和下载SMPL+H和DMPL模型。-[2]:关于导入SMPL模型的代码片段。-[3]:关于EVA3D项目的目录结构。用户的直接问题是关于Jupyter和SMPL的集成。用户可能在使用机器学习或3D建模相关的东西,因为SMPL(SkinnedMulti-PersonLinearModel)是一种用于3D人体建模的技术,JupyterNotebook是一个交互式计算环境。我需要基于这些引用和知识来回答。关键点:-引用[1]提到使用pip安装jupyter,意味着用户可以安装JupyterNotebook。-引用[2]显示了在代码中使用smplx库来创建SMPL模型,这看起来像是Python代码。-引用[3]是关于EVA3D项目的,可能使用了SMPL。用户在问题中提到了“集成SMPL在Jupyter中”,意思是使用SMPL在JupyterNotebook中。可能的回答结构:1.**介绍关系**:解释Jupyter和SMPL之间没有直接关系;Jupyter是运行代码的工具,SMPL是一个模型或库。所以,在Jupyter中使用SMPL意味着在JupyterNotebook中运行Python代码来导入和使用SMPL库。2.**步骤指南**:基于引用[2],提供如何在JupyterNotebook中设置和使用SMPL的具体步骤。可能包括:-安装必要的库(如smplx)。-导入库并创建模型。-展示代码示例。3.**引用**:使用提供的引用自然地引用相关部分。例如,参考[^2]中的代码片段。4.**数学表达式**:如果有数学部分,使用LaTeX。SMPL模型本身是基于数学的,比如旋转和缩放,但我应该只在必要时添加。可能简要说明模型结构或用LaTeX展示核心方程。5.**生成相关问题**:在回答结束后,生成几个相关问题。6.**使用中文**:整个回答用中文写。逐步构建回答:-**开头**:澄清Jupyter和SMPL的关系。Jupyter是一个交互式计算环境,SMPL是一个人体3D模型库,可以在Python中使用。所以,在Jupyter中集成就是运行Python代码。-**设置环境**:参考[^1],提到如何安装依赖,包括Jupyter和smplx库。命令如`pipinstallsmplx`或类似。-引用[1]提到`pipinstalljupyter`等,和下载模型。所以,我可以建议从GitHub克隆代码或下载模型。-**代码示例**:基于[^2],提供一个代码片段,展示在JupyterNotebook中导入和使用SMPL。例如:```pythonimportsmplxmodel_folder="../data/smpl_models"model_type="smpl"gender="neutral"body_model=smplx.create(model_folder,model_type=model_type,gender=gender)```然后解释这个代码在Jupyter中运行。-**EVA3D参考**:引用[^3]提到EVA3D项目有notebook目录,可能包含Jupyter笔记本用于演示或训练。所以,如果用户有这个项目,可以直接使用。-**结束**:总结方法,并生成相关问题。最终回答结构:1.**简介**:说明JupyterNotebook中如何使用SMPL。2.**步骤**:分步指导如何在Jupyter中设置和使用SMPL。-安装Jupyter。-安装SMPL相关库(如smplx)。-下载模型文件。-编写和运行代码。3.**代码块**:用代码块展示示例,参考系统指令中的示例(使用```python...```)。4.**引用**:在相关部分添加[^1]、[^2]等。5.**相关问题**:在最后添加§§相关问题§§。确保回答真实可靠。我对此有些知识:SMPL是一个Python库,可以安装,并在Jupyter中使用。生成相关问题:1.如何在Jupyter中可视化SMPL模型?2.SMPL模型有哪些参数可以调整?3.在Jupyter中使用SMPL进行实时交互的方法?用中文写出完整的回答。</think> ### Jupyter与SMPL的集成方法 Jupyter Notebook 是一个交互式计算环境,用于运行和演示Python代码,而SMPL (Skinned Multi-Person Linear Model) 是一个用于3D人体建模的Python库,常用于生成或操作人体姿势、形状等。Jupyter与SMPL之间没有直接“集成关系”,但您可以在Jupyter Notebook中直接使用SMPL库,通过在笔记本中运行Python代码来加载、操作和可视化模型。这种方式类似于在普通Python脚本中使用SMPL,但Jupyter的交互性使其更适合调试、可视化和教学演示。 下面,我将一步步指导您如何在Jupyter Notebook中设置和使用SMPL。方法基于常见实践和您提供的引用内容(例如引用[1]和[2])。关键步骤包括:**安装依赖环境**、**设置模型文件**、**编写代码**和**运行示例**。 --- ### 步骤1: 安装环境依赖 在Jupyter Notebook中使用SMPL之前,需要确保Python环境正确配置。这包括安装Jupyter Notebook自身和SMPL相关库(如 `smplx`、`torch`等)。以下是基于引用[1]的推荐命令,使用pip进行安装。建议在Anaconda虚拟环境中操作,以避免依赖冲突。 - **创建并激活虚拟环境**: ```bash conda create -n smpl_env python=3.7.10 # 创建名为smpl_env的虚拟环境 conda activate smpl_env # 激活环境 ``` - **安装Jupyter和SMPL依赖库**: 引用[1]提到使用国内源(如阿里云镜像)加速安装: ```bash pip install jupyter -i https://mirrors.aliyun.com/pypi/simple/ pip install numpy scipy torch tqdm pandas matplotlib==3.3.4 spacy==2.3.4 smplx -i https://mirrors.aliyun.com/pypi/simple/ ``` 解释:`smplx` 是官方SMPL库的Python封装,依赖PyTorch。可视化可能需要额外安装库如 `matplotlib` 或 `plotly` [^1]。 - **下载SMPL模型文件**: SMPL模型文件(如 .pkl 文件)需要手动下载。引用[1]提到从项目网站下载模型: ```bash # 示例:下载SMPL+H或DMPL模型(需替换为实际链接,类似https://smpl-x.is.tue.mpg.de/downloads) mkdir -p ../data/smpl_models # 创建模型存储目录 # 假设您将下载的文件放置在 ../data/smpl_models 中 ``` 下载后,确保模型文件可用(例如 `neutral_model.pkl` 等)。模型路径会在后续代码中引用 [^1]。 --- ### 步骤2: 在Jupyter Notebook中导入和使用SMPL Jupyter Notebook允许您直接在单元格中运行Python代码。基于引用[2],下面是一个完整的示例,展示如何导入SMPL库、加载模型并初步操作。 - **启动Jupyter Notebook**: 在激活的虚拟环境中运行命令: ```bash jupyter notebook # 启动Jupyter服务,并在浏览器中打开 ``` 然后创建一个新的Notebook(如 New > Python 3)。 - **在Notebook中编写代码**: 在新单元格中输入以下代码。这加载了SMPL模型并创建了一个基本的3D人体实例。引用[2]显示了关键部分: ```python # 导入必要库 import smplx import torch # 设置模型路径和参数 model_folder = "../data/smpl_models" # 模型文件目录,确保路径正确 model_type = "smpl" # SMPL模型类型,可以是&#39;smpl&#39;, &#39;smplx&#39;等 gender = "neutral" # 性别选项,如&#39;neutral&#39;, &#39;male&#39;, &#39;female&#39; # 创建SMPL模型实例(使用PyTorch后端) body_model = smplx.create(model_folder, model_type=model_type, gender=gender, use_pca=False, # 不使用姿势PCA简化 batch_size=1) # 批处理大小为1 # 设置初始姿势和形状参数(例如全零表示中立姿势) betas = torch.zeros(1, 10) # 形状参数(10维向量) pose = torch.zeros(1, 72) # 姿势参数(72维:关节旋转) # 生成模型输出(顶点和关节位置) output = body_model(betas=betas, pose=pose, return_verts=True) vertices = output.vertices.detach().numpy() # 获取顶点数组 # 打印信息:顶点数量为6890个(基于SMPL标准网格) print(f"生成模型顶点数: {vertices.shape[1]}") ``` 代码说明: - `smplx.create` 函数加载模型文件(引用[^2])。 - 使用 `torch` 库处理张量数据,SMPL核心基于PyTorch或TensorFlow实现。 - 参数如 `betas` 控制形状(身体胖瘦),`pose` 控制姿势(如旋转)。数学上,模型输出顶点位置是这些参数的函数:设输入参数 $\mathbf{\beta} \in \mathbb{R}^{10}$ 和 $\mathbf{\theta} \in \mathbb{R}^{72}$,则输出顶点 $\mathbf{V} = f(\mathbf{\beta}, \mathbf{\theta})$,其中 $f$ 是SMPL模型函数。 - **运行和调试**: 在Jupyter中运行单元格后,可以即时查看输出(如顶点数量),并使用其他库(如 `matplotlib`)可视化结果。例如: ```python %matplotlib inline # 在Notebook内嵌显示图表 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.add_subplot(111, projection=&#39;3d&#39;) ax.scatter(vertices[0, :, 0], vertices[0, :, 1], vertices[0, :, 2], s=1) # 绘制3D散点图 plt.title("SMPL模型生成的3D人体") plt.show() ``` --- ### 关键关系和注意事项 - **Jupyter与SMPL的交互优势**:Jupyter允许逐行执行和可视化(如3D渲染),便于调试模型参数。数学上,您可以探索模型的数学基础,例如SMPL的核心是一个线性蒙皮模型,顶点位置通过混合形状和姿势变形计算: $$ \mathbf{V} = \mathbf{T} + \sum_{k=1}^{K} w_k \cdot \mathbf{B}_k(\mathbf{\beta}) + \mathbf{R}(\mathbf{\theta}) $$ 其中 $\mathbf{T}$ 是参考姿态,$\mathbf{B}_k$ 是混合形状,$\mathbf{R}$ 是旋转矩阵。在Jupyter中,您可以修改 $\mathbf{\beta}$ 和 $\mathbf{\theta}$ 来实时观察变化 [^1][^2]。 - **EVA3D项目参考**:引用[3]提到项目目录包含 `notebook` 文件夹,这通常是Jupyter笔记本的存储位置(如用于训练或演示)。如果使用类似项目,可以克隆代码库并直接在Notebook中运行: ```bash git clone https://github.com/your-project/repo # 替换为实际链接 cd repo/notebook jupyter notebook # 打开现有Notebook ``` 这简化了集成过程 [^3]。 - **常见问题解决**: - **依赖冲突**:如果您安装了 `spacy==2.3.4`(引用[1]),可能与某些版本不兼容,建议优先安装SMPL核心库。 - **路径问题**:确保模型文件路径正确(如 `../data/smpl_models`),否则代码会报错。您可以使用 `os.path` 模块动态设置路径。 - **可视化增强**:对于更丰富的3D渲染,可以结合 `plotly` 或 `pyrender` 库。 通过以上方法,您可以在Jupyter Notebook中高效地使用SMPL进行建模和实验。如果需要更多代码示例(如实时姿势编辑),可以分享您的具体项目上下文。 [^1]: 安装步骤参考自引用[1]的依赖管理和模型下载。 [^2]: 模型导入代码基于引用[2],展示如何在Python中使用SMPL。 [^3]: 项目结构示例源自引用[3],说明notebook在项目中常用于集成演示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值