日期时间数据类型概述

日期时间数据有时间点、时间段和时间差等多种类型。MATLAB和Python都可以处理这几种类型的日期时间数据。本节主要介绍几种日期时间数据的创建。[大谦MATLAB,dqmatlab点com]

创建时间点

时间点是一个具体的时刻。可以用某天内的某分某秒表示,也可以用距离某指定时间的时间距离来表示。

【MATLAB】

MATLAB中用datetime函数创建表示日期和时间的数组,可以有多种创建方式。

不带参数时,datetime函数返回当前日期和时间。

在命令窗口中输入:

code.matlab
>> T=datetime
T=
   2023-12-18 08:08:44

datetime函数的参数可以是表示日期时间的字符串向量,也可以指定显示格式。

使用datetime函数并指定日期、时间和显示格式。在命令窗口中输入:

code.matlab
>> T=datetime({'2023-12-18';'2023-12-19'},'InputFormat','yyyy-MM-dd')
T=
   2023-12-18
   2023-12-19

也可以把年、月、日的值分别写成数组,然后用datetime函数创建日期时间数组。

使用datetime函数创建日期时间数组。在命令窗口中输入:

code.matlab
>> Y=[2021;2022;2023];
>> M=06;
>> D=[11;20;30];
>> T=datetime(Y,M,D)
T=
   2021-06-11
   2022-06-20
   2023-06-30

【Python】

Python有多个包支持日期时间类型的数据操作,如datetime包、time包和pandas包等。

下面导入datetime包。

code.python
>>> import datetime

获取当前日期和时间。

code.python
>>> dt=datetime.datetime.now()
>>> dt
datetime.datetime(2024, 1, 13, 10, 21, 37, 941310)

输出当前时间点对应的年、月、日、小时、分钟、秒和微秒数。注意,1秒等于1000毫秒,1毫秒等于1000微秒。

获取当前时间点的时间戳。

code.python
>>> datetime.datetime.timestamp(dt)
1705112497.94131

这里,时间戳表示当前时间点距离1970年1月1日午夜(历元)的秒数。

可以指定各时间单位对应的数字,用datetime函数组合成一个日期时间数据。

code.python
>>> dt2=datetime.datetime(2023,10,12,12,30,10)
>>> dt2
datetime.datetime(2023, 10, 12, 12, 30, 10)

下面导入time包,用该包的time函数可以获取当前时间戳。

code.python
>>> import time
>>> time.time()
1705112967.7991848

用time模块的localtime函数获取当前日期和时间。

code.python
>>> t= time.localtime(time.time())
>>> t
time.struct_time(tm_year=2024, tm_mon=1, tm_mday=13, tm_hour=10, tm_min=29, tm_sec=42, tm_wday=5, tm_yday=13, tm_isdst=0)

返回的结果用称为时间元组的结构字段来表示。结构中各字段的意义如表6-1所示。

表6-1 时间元组的结构字段

序号 属性 说 明 值
0 tm_year 4位数年份 2021
1 tm_mon 月份 1-12
2 tm_mday 日期 1-31
3 tm_hour 小时 0-23
4 tm_min 分钟 0-59
5 tm_sec 秒 0-61 (60或61是闰秒)
6 tm_wday 星期几 0-6 (0是周一)
7 tm_yday 一年的第几天 1-366
8 tm_isdst 夏令时 -1, 0, 1, -1

下面结合pandas包进行介绍。

pandas包中用时间戳表示时间点。pandas中的时间戳以纳秒为单位,比datetime包和time包中用秒表示的的时间戳精度更高。前面讲了,1秒等于1000000微秒,1微秒又等于1000纳秒。所以,pandas包中的时间戳是一个很大的数。

导入pandas包,获取当前时间点。

code.python
>>> import pandas as pd
>>> t=pd.Timestamp.now()
>>> t
Timestamp('2024-01-13 11:05:04.663406')

同样是精确到微秒。用距离1970年1月1日午夜的纳秒数表示时间戳。

code.python
>>> t.value
1705143904663406000

指定各时间单位对应的数字,用Timestamp函数返回时间点。

code.python
>>> ts=pd.Timestamp(datetime.datetime(2023,10,12,12,30,10))
>>> ts
Timestamp('2023-10-12 12:30:10')

指定字符串表示的日期,用Timestamp函数返回时间点。

code.python
>>> ts2=pd.Timestamp('20231012')
>>> ts2
Timestamp('2023-10-12 00:00:00')

用to_datetime函数将表示日期时间的字符串转换为日期时间类型的数据。

code.python
>>> pd.to_datetime('2022-03-18 00:00:00')
Timestamp('2022-03-18 00:00:00')

创建时间差

时间差指的是两个时间点之间的时间差值,强调的是时间的长度。比如3月1日零点到3月3日午夜的时间差是3天,是时长的概念。

【MATLAB】

MATLAB用duration函数创建时间差。下面创建时间差6小时10分钟5秒,在命令窗口中输入:

code.matlab
>> D=duration(6,10,5)
D=
   06:10:05

创建时间差2天12小时40分钟5秒,在命令窗口中输入:

code.matlab
>> D2=duration('2:12:40:5')
D2=
   60:40:05

2天时长转换成48小时与原来的小时数12合并成了60。

可以将数值矩阵数据转换为时间差数组。在命令窗口中输入:

code.matlab
>> X=[10 13 45;9 16 38];
>> D=duration(X)
D=
   10:13:45
   09:16:38

用years函数可以创建固定长度年的时间差数组。在命令窗口中输入:

code.matlab
>> X=[1 2 3;4 5 6];
>> Y=years(X)
Y=
   1年   2年   3年
   4年   5年   6年

创建固定长度时间差数组的函数如表2-10所示。

表2-10 创建固定长度时间差数组的函数

函 数 说 明
years 时间差按年算
days 时间差按天算
hours 时间差按小时算
minutes 时间差按分钟算
seconds 时间差按秒算
milliseconds 时间差按毫秒算

【Python】

Python的datetime包和pandas包中都有timedelta(Timedelta)函数,可以使用该函数创建时间差。下面以pandas包中的Timedelta函数为例进行介绍。

通过转换字符串创建时间差10天5小时8分钟:

code.python
>>> import pandas as pd
>>> pd.Timedelta('10 days 5 hours 8minutes')
Timedelta('10 days 05:08:00')

指定整数和单位创建:

code.python
>>> pd.Timedelta(10,unit='D')
Timedelta('10 days 00:00:00')

指定时长参数的值创建:

code.python
>>> pd.Timedelta(days=10)
Timedelta('10 days 00:00:00')

两个时间点相减创建:

code.python
>>> pd.to_datetime('2023-10-12')-pd.to_datetime('2023-10-02')
Timedelta('10 days 00:00:00')

创建时间段

时间段指的是从起始时间点到终止时间点这两点之间的一段时间。与前面介绍的时间差比较,时间差强调的是两个时间点之间的时间长度,是标量;时间段则明确两个时间点的起点和终点,是矢量。8月作为时间段可以理解为8月1日零时到8月31日午夜这段时间。8月、9月和10月是不同的时间段,但它们对应的时间差都是1个月时长。

【MATLAB】

MATLAB中没有提供现成的函数创建时间段。但是可以通过指定两个时间点作为起始时间点和终止时间点来表示时间段,也可以指定起始时间点和时间差计算终止时间点并最终得到时间段。

【Python】

Python中可以使用pandas包的Period函数创建时间段。使用该函数时,用字符串指定一个日期或时间,用freq参数指定时间段的长度。

下面创建2023年10月12日这一天作为时间段:

code.python
>>> import pandas as pd
>>> p=pd.Period('2023-10-12',freq='D')
>>> p
Period('2023-10-12', 'D')

获取该时间段的起始时间点和终止时间点:

code.python
>>> p.start_time
Timestamp('2023-10-12 00:00:00')
>>> p.end_time
Timestamp('2023-10-12 23:59:59.999999999')

可见,该时间段的起始时间点是2023年10月12日零点,终止时间点是2023年10月12日午夜。

下面把freq参数的值改成2天。

code.python
>>> p2=pd.Period('2023-10-12',freq='2D')

获取起始时间点和终止时间点:

code.python
>>> p2.start_time
Timestamp('2023-10-12 00:00:00')
>>> p2.end_time
Timestamp('2023-10-13 23:59:59.999999999')

所以,时间段是一个矢量的概念,有起点,有终点。修改freq参数的值可以创建其他类型的时间段。