Python中的时间格式(1):详细版
时间格式是一类较特殊也十分普遍的格式,大量数据都含有时间信息,在实际的学习中会经常接触。最近有创建、处理或转换时间序列数据的需求,因此做一个梳理并汇总以便在后续遇到相关处理时可以拿来即用,还有另一个简化的速查版。本文主要涉及内容:
- python内置模块time及 datetime的时间格式及处理
- Pandas时间格式的表达及常规处理
主要参考
不论是Python的内置模块还是第三方提供的模块,官网的文档都是很好的学习资源,尤其是想要了解地更深的时候或者debug的时候,
- https://strftime.org/
Python官方文档
NumPy
Pandas,pandas主要处理表格型数据,因此实际中数据以时间序列存在
涉及Python模块和类、实例、属性及方法相关相关的概念可查阅此文Python中的类
!在实际中最常用的其实一般是datetime的部分功能(如下),此文将各模块功能列出,便于检索
| 1 | import time | 
内置模块time
表达格式
- 数字 <'float'>,Unix时间戳:从epoch(1970年1月1日00:00:00 UTC)经过的秒数/偏移量,如631123200000表示"1990-01-01 00:00:00" 
- 时间元组 < 'time.struct_time'>(实际实现,给计算机看的)包含了一个时间的完整信息 - time.struct_time(tm_year=2022, tm_mon=5, tm_mday=11, tm_hour=2, tm_min=53, tm_sec=2, tm_wday=2, tm_yday=131, tm_isdst=0)
 
- 字符串 <'str'>(可读性强,给人看的):如"1990-01-01 00:00:00","2018-01-01","1998/01/01"等 
时间获取
| 1 | # print("获取计算机当前时间时间:{0},数据类型:{1}".format(t, type(t))) | 
单个时间转换(strftime()+strptime())
将时间元组转换为格式化字符串
| 1 | t_struct = time.gmtime() #创建时间元组 | 
将字符串转换为时间元组
| 1 | t_string = '2022-05-16 13:16:15' | 
所有格式化参数可以在此页面查找strftime() 常用的如下(注意区分大小写):
- %Y %m %d: 2022-05-01,- %Y %-m %-d: 2022-5-1,
- %H %M %S: 05:01:08,- %-H %-M %-S: 5:1:8,
- %x:'05/11/22',
- %X:''02:49:06',
- %c: 'Wed May 11 02:49:36 2022'
- %a: Sun,- %A: Sunday,- %W:0-6,weekday
- %b: Jan,- %B: January,
- ...
- %z: UTC offset in the form +HHMM or -HHMM. "%z %Z":'+0800 中国标准时间'
- %j: 001, 002, ..., 366,
- %U- %W:周数,一年的第多少周,前者表示周日为第一天
其他函数
| 1 | # 脚本运行时间计算 | 
🔥内置模块datetime
time较为底层,一般用的不多,其他实际中主要用datetime datetime是基于time包开发的包,datetime可以拆解为date和time两个部分。可以将这两个分开管理(datetime.date类,datetime.time类),也可以将两者合在一起(datetime.datetime类),datetime包还定义了时间间隔对象(timedelta)。
子类/对象
类,这些类可以直接通过"属性"进行实例化对象,如datetime.date(2022, 5, 20)
- datetime.time:独立于任何特定日期的理想化时间,包含属性: hour, minute, second, microsecond 和 tzinfo。- 属性的意思表明可以通过 .month .hour获取对象实例的属性值
 
- datetime.date: 理想化的简单型日期, 属性: year, month, and day。
- datetime.datetime: 日期和时间的结合。属性:year, month, day, hour, minute, second, microsecond, and tzinfo.
- datetime.timedelta:表示两个 date 对象或 time 对象,或者 datetime 对象之间的时间间隔,精确到微秒。- 常用于时间之间的加减等操做
 
- datetime.tzinfo:时区信息对象
- datetime.timezone:表示相对于UTC的偏移量
这些类创建实例的共有属性
- 不可变
- 可哈希,即可以作为字典的键key
- 支持通过pickle模块进行高效封存,惯用pickle可以为实际工作带来诸多便利,见pickle使用-待更新
- 支持加减法,且涉及时间间隔及时间差等可以通过timedelta进行运算
date常用操作
time的操作与之类似
获取/创建时间
| 1 | from datetime import date, timedelta | 
UTC时间转北京时间:time_bj = time_utc+ timedelta(hours=8)
日期与字符串格式的转换
将时间date转换为格式化字符串
| 1 | from datetime import date | 
将字符串转换为日期date
| 1 | t1 = '2022-01-01' | 
- 其他方法,时间替换 - date.replace(year=self.year, month=self.month, day=self.day)- 1 
 2
 3
 4
 5
 6
 7
 8
 9- d = date(2022, 12, 31) 
 # 时间替换
 d2 = d.replace(day=26)
 #返回一个 time.struct_time
 d3 = date.timetuple(d)
 # 获取当前时间的字符串格式
 t = date.today()
 t.ctime()# 等价于`time.ctime(time.mktime(d.timetuple()))`
 #输出'Mon May 16 00:00:00 2022'
🔥datetime常用操作
获取/创建时间
| 1 | from datetime import datetime, date, time, timezone | 
时间合并
| 1 | from datetime import datetime, date, time | 
时间与字符串的转换,参数与time模块类似
| 1 | # 字符串转时间 | 
Pandas中的时间格式
pandas为表格,因此处理的一般为时间序列而非单个时间
pandas中的时间格式主要为以下两类
- datetime (datetime64[ns]), 类比datetime
- String/Object
创建序列
pd.date_range()
- pandas.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, ...)文档
- 参数说明
- start end:起始日期
- periods:日期数量
- freq: 间隔,默认- D,可以设- M,- 8H详见
- inclusive:='both','left','right','neither'指定左右是否闭合,如生成某月份数据但不知道该月多少天,可以指定为left,右边写下月第一天
 
常用代码
| 1 | # 创建序列, 可以直接接收 | 
🔥时间序列格式转换
datetime→string:astype()+strftime(),输入的列为datetime64[ns]类型
| 1 | # astype() | 
string→datetime: to_datetime,输入的列为String或Object类型
| 1 | df['time']=pd.to_datetime(df['time_str'].astype(str), format='%Y/%m/%d') | 
时间合并与拆分
这里pd.to_datetime函数比较憨,只能识别指定的列名,所以如果不一致需要先改名
| 1 | # 合并 | 
基于时间筛选数据
&与;|或
| 1 | # df['time']为时间格式: | 
其他操作
待补充 ……
有了以上的基础,在实际中可以灵活按需涉及方案排列组合等实现想要的结果……