本节结合实例介绍与时间点有关的应用,包括从给定日期时间数据中提取部分日期或时间,日期时间数据的格式化输出等。[大谦MATLAB,dqmatlab点com]
从给定日期时间中提取单位对应的数字
对于给定的日期时间数据,MATLAB和Python可以用函数从中提取出年份、月份、日期、小时、分钟、秒、星期时间单位对应的数据。
【MATLAB】
MATLAB中用datetime函数获取当前日期和时间:
>> T=datetime
T=
2023-10-16 13:45:52
获取年份和小时数。
>> Y=year(T)
Y =
2023
>> H=hour(T)
H =
16
按时间单位提取对应数据的函数如表2-11所示。
表2-11 按时间单位提取分量的函数
| 函 数 | 说 明 |
|---|---|
| year | 年份数 |
| quarter | 季度数 |
| month | 月份数和名称 |
| week | 周数 |
| day | 日期数和名称 |
| hour | 小时数 |
| minute | 分钟数 |
| second | 秒数 |
【Python】
6.1.1小节介绍了用pandas包创建时间点。下面用Timestamp函数创建1个时间点。
>>> import pandas as pd
>>> t=pd.Timestamp.now()
>>> t
Timestamp('2024-01-13 13:28:35.213901')
通过引用时间戳对象t的year, month, day, hour, minute和second等属性,可以对应地获取日期时间数据里面的年、月、日、小时、分钟和秒对应的整数。
>>> t.year
2024
>>> t.month
1
>>> t.hour
13
>>> t.second
35
日期时间的显示格式
日期时间数据可以有不同的显示格式,MATLAB和Python都提供了相应的函数进行操作。
【MATLAB】
默认时,MATLAB中的日期时间的显示格式为:dd-mm-yyyy hh:mm:ss。例如,12-Sep-2018 01:10:29表示2018年9月12日1点10分29秒。
用yyyymmdd函数可以将日期转换为yyyymmdd格式。在命令窗口中输入:
>> T=datetime
T=
2018-09-13 13:45:52
>> T2=yyyymmdd(T)
T2 =
20180913
用exceltime函数可以将日期时间转换为Excel日期数字。Excel日期数字由自1900年1月1日 00:00:00 开始的整天数和小数天数组成。在命令窗口中输入:
>> T3=exceltime(T)
T3 =
4.3357e+04
【Python】
Python中可以使用strftime方法对日期时间数据进行格式化输出。
下面导入datetime包,获取当前日期时间。
>>> import datetime
>>> t=datetime.datetime.now()
>>> t
datetime.datetime(2024, 1, 13, 13, 47, 20, 697275)
用strftime方法用指定格式输出当前日期:
>>> t1=t.strftime('%Y-%m-%d')
>>> t1
'2024-01-13'
输出当前时间:
>>> t2=t.strftime('%H:%M:%S')
>>> t2
'13:47:20'
输出当前日期和时间:
>>> t3=t.strftime('%Y-%m-%d %H:%M:%S')
>>> t3
'2024-01-13 13:47:20'
在pandas中格式化输出日期时间数据,使用类似下面的语法格式:
>>> import pandas as pd
>>> df['date'].dt.strftime('%Y-%m-%d')
其中,df['date']表示名为“date”的列。
示例1:从身份证号提取出生日期
本例给定一组身份证号码,要求从中提取出对应的出生日期。身份证号码中的第7位到第14位对应该人的出生日期。
【MATLAB】
MATLAB使用extractBetween函数从给定的字符串中提取子字符串。先提取出表示出生日期的子字符串。
>> cd=["522324197403081***","522324196302051***","522324200701225***"];
>> id=extractBetween(cd,7,14)
id=
1×3 string 数组
"19740308" "19630205" "20070122"
用datetime函数将字符串转换为指定格式的日期。
>> T=datetime(id,'InputFormat','yyyyMMdd')
T=
1×3 datetime 数组
1974-03-08 1963-02-05 2007-01-22
【Python】
Python中处理一组数据用pandas包效率比较高。先给定表示身份证号码的字符串列表,将它转换为Series。
>>> import pandas as pd
>>> cd=['522324197403081***','522324196302051***','522324200701225***']
>>> cd2=pd.Series(cd)
>>> cd2
0 522324197403081***
1 522324196302051***
2 522324200701225***
dtype: object
用Series对象的字符串切片方法提取表示出生日期的子字符串。
>>> id=cd2.str[6:14]
>>> id
0 19740308
1 19630205
2 20070122
dtype: object
使用to_datetime函数将字符串转换为日期时间数据。
>>> bd=pd.to_datetime(id)
>>> bd
0 1974-03-08
1 1963-02-05
2 2007-01-22
dtype: datetime64[ns]
示例2:计算给定日期是星期几
本例给定一组表示值班日期的日期数据,用MATLAB和Python计算它们是星期几。
【MATLAB】
MATLAB中给定字符串表示的日期数组,用datetime函数转换为指定格式的日期。
>> dt=["2022-8-20","2022-8-22","2022-8-25"];
>> T=datetime(dt,'InputFormat','yyyy-MM-dd')
T=
1×3 datetime 数组
2022-08-20 2022-08-22 2022-08-25
用weekday函数计算各日期分别是星期几。
>> ws=weekday(T)
ws =
7 2 5
查万年历后发现得到的星期几比国内公历的多1天。这是因为MATLAB中weekday函数返回的星期几用的是美国表示法,星期天为1,星期一为2,如此类推。所以,需要将以上结果减1。
>> ws-1
ans=
6 1 4
【Python】
Python中用pandas包进行处理。先用列表给出字符串表示的日期,并用该列表创建一个Series对象。
>>> import pandas as pd
>>> dt=['2022-8-20','2022-8-22','2022-8-25']
>>> cd=pd.Series(dt)
用to_datetime函数将字符串转换为日期。
>>> cd2=pd.to_datetime(cd)
用Series对象的dt.dayofweek属性获取日期对应的星期几。因为Python中索引基数为0,即星期一对应的是0,所以属性返回的结果需要加上1。
>>> wd=cd2.dt.dayofweek+1
>>> wd
0 6
1 1
2 4
dtype: int64