matlab 日期加小时数_MATLAB时间与日期的基本操作
7.2 日期和時間元素
本小節將為讀者介紹如何對指定日期和時間元素的數值進行提取,另外如何通過datetime的屬性來對指定的元素進行賦值。MATLAB提供了如下函數進行元素操作,請見表3-12。
表3-12 日期和時間元素提取函數
函 數
說 明
函 數
說 明
year
年份
minute
分鐘
hour
小時
second
秒
day
日
quarter
季度數
month
月份
week
星期數
ymd
年月日
hms
時分秒
split
將日歷時間長度按單位級別分解為數值形式
time
將日歷時間長度轉換為固定時間長度
timeofday
將時間點轉換為時間長度
isdst
檢測夏令時元素
isweekend
檢測是否是周末
tzoffset
檢測時區,返回和UTC的時差
下面我們舉例來說明如何從已有的datetime數組中提取日期和時間元素。然后將會介紹如何對指定元素通過對數組屬性的設置來進行修改。
【例3-45】 日期和時間數組元素的提取。
首先創建一個測試用datetime數組。
>> t = datetime('now') + calyears(0:2) +calmonths(0:2) + hours(20:20:60)
t =
04-Sep-2014 20:42:32 05-Oct-201516:42:32 06-Nov-2016 12:42:32
如果想提取數組中的“年”這一元素,那么只需要使用“.”這一符號加Year屬性就可以了。
>> t_years = t.Year
t_years =
2014 2015 2016
輸出的t_years是一個數值數組。
同樣的,如果想提取月這一元素,可以通過以下方法:
>> t_months = t.Month
t_months =
9 10 11
在以上方法之外,用戶可以通過函數來對日期和時間的各元素進行檢索。例如要檢索月份的話,那么就可以通過month函數來實現。
>> m = month(t)
m =
9 10 11
通過使用month函數而不是Month屬性來提取月份的全名:
>> m = month(t,'name')
m =
'September' 'October' 'November'
同樣的也可以使用year,quarter,week,hour,minute和second函數來分別提取時間數組t中的其他元素:
>> w = week(t)
w =
36 41 46
這里返回的是數據所對應與當年第幾周。
使用ymd函數可以同時提取年、月、日三個元素:
>> [y,m,d] = ymd(t)
y =
2014 2015 2016
m =
9 10 11
d =
4 5 6
使用hms函數可以同時提取時、分、秒三個元素:
>> [h,m,s] = hms(t)
h =
20 16 12
m =
42 42 42
s =
32.9365 32.9365 32.9365
【例3-46】 日期和時間數組元素的修改。
對已有時間數組中的元素數值進行修改可以通過“.”加屬性名來實現。
改變時間數組t中的年份,令其等于2014:
>> t.Year = 2014
t =
04-Sep-2014 20:42:32 05-Oct-201416:42:32 06-Nov-2014 12:42:32
將時間數組t中的月份分別改成1月、2月、3月:
>> t.Month = [1,2,3]
t =
04-Jan-2014 20:42:32 05-Feb-201416:42:32 06-Mar-2014 12:42:32
通過TimeZone屬性更改時間數組的時區:
>> t.TimeZone = 'Europe/Berlin';
更改時間數組的顯示格式:
>> t.Format = 'dd-MMM-yyyy'
t =
04-Jan-2014 05-Feb-2014 06-Mar-2014
如果用戶在賦值的時候給出的數值超出了正常范圍,那么MATLAB會對相應的元素進行正?;幚怼@?#xff0c;日期的正常范圍是1-31,如果將范圍之外的數值賦值給數組,那么結果如下:
>> t.Day = [-1 1 32]
t =
30-Dec-2013 01-Feb-2014 01-Apr-2014
這里月份和年份的數值同時做了調整,從而使結果是屬于正常范圍的。例如這里將January -1, 2014轉化成為了December 30, 2013。
7.3 日期和時間計算與繪圖
本小節將為讀者介紹日期和時間的相關加、減、繪圖操作。MATLAB提供了多種函數以供使用,見表3-13。
表3-13 日期和時間計算函數
函 數
說 明
函 數
說 明
between
日歷代數差
isdatetime
判斷是否是datetime數組
caldiff
日歷連續代數差
isduration
判斷是否是duration數組
dateshift
平移日期或者產生日期和時間序列
iscalendarduration
判斷是否是calendar duration數組
isbetween
判斷元素是否在日期和時間區間內
isnat
判斷是否是NaT元素(非時間元素)
【例3-47】 日歷時間長度與時間數組相加。
將一個日歷時間長度數組和日期January31, 2014相加:
>> t1 = datetime(2014,1,31) % 測試時間數組
t1 =
31-Jan-2014
>> t2 = t1 + calmonths(1:4) % 將日歷月相加
t2 =
28-Feb-2014 31-Mar-2014 30-Apr-2014 31-May-2014
結果中的每一個時間點都是當月的最后一天。
使用caldiff 函數可以計算數組中相鄰的一對時間點之差:
>> dt = caldiff(t2,'days') % 計算數組各時間點之間的日歷天數差
dt =
31d 30d 31d
從結果中可以看出,連續的幾對時間點之間的差都是一個日歷月,但是天數并不都是等于31天。
同樣的我們可以對年份也進行類似的操作:
>> t2 = t1 + calyears(0:4) % 初始測試數組
t2 =
31-Jan-2014 31-Jan-2015 31-Jan-2016 31-Jan-2017 31-Jan-2018
使用caldiff函數可以計算數組t2中相鄰時間點之間的天數差:
>> dt = caldiff(t2,'days')
dt =
365d 365d 366d 365d
由結果可以看出,并不是每一年的天數都等于365天。
【例3-48】 計算兩個日歷時間點之間的時間差。
使用between函數可以計算兩個日歷時間點之間的年、月、日之差。
>> t1 = datetime('today')
t1 =
02-Apr-2015
>> t2 = t1 + calmonths(0:2) + caldays(4)
t2 =
06-Apr-2015 06-May-2015 06-Jun-2015
>> dt = between(t1,t2)
dt =
4d 1mo 4d 2mo 4d
【例3-49】 datetime和duration數組的比較。
本例將為讀者演示如何對datetime和duration數組進行比較。用戶可以在兩個datetime數組之間進行元素對元素的對比,也可以對兩個duration數組采用邏輯運算符進行比較,例如>和<。
對比兩個datetime數組,兩個數組必須具有相同的尺寸或者其中一個是標量。
>> A = datetime(2013,07,26) +calyears(0:2:6)
>> B = datetime(2014,06,01)
A =
26-Jul-2013 26-Jul-2015 26-Jul-2017 26-Jul-2019
B =
01-Jun-2014
>> A < B
ans =
1 0 0 0
在A中的時間早于B中的時間情況下,邏輯運算符<將會返回邏輯值1(true)。
對比一個datetime數組和一個日期字符串:
>> A >= 'September 26, 2014'
ans =
0 1 1 1
讀者還可以對比不同時區的時間。例如比較洛杉磯的September 1, 2014 at 4:00 p.m和同一天的紐約時間5:00p.m:
>> A = datetime(2014,09,01,16,0,0,'TimeZone','America/Los_Angeles',...
'Format','dd-MMM-yyyy HH:mm:ss Z')
A =
01-Sep-2014 16:00:00 -0700
>> B =datetime(2014,09,01,17,0,0,'TimeZone','America/New_York',...
'Format','dd-MMM-yyyy HH:mm:ss Z')
B =
01-Sep-2014 17:00:00 -0400
>> A < B
ans =
0
從結果可以看出洛杉磯時間下午4點在紐約時間下午5點之后。
下面我們來對duration數組之間的比較進行演示。
>> A = duration([2,30,30;3,15,0]) % 測試數據A
>> B = duration([2,40,0;2,50,0]) % 測試數據B
A =
02:30:30
03:15:00
B =
02:40:00
02:50:00
>> A >= B
ans =
0
1
從結果中可以看出,和B相比較,A的第一個元素較短,而第二個元素較長。
如果將一個duration數組和一個數值型的數組進行比較,那么數值型的數組將會被看作是天數(固定每天24小時)。
>> A < [1; 1/24] % A和【1天 1小時】相比較
ans =
1
0
使用isbetween函數可以判斷某一日期時間是否在一個時間區間內。
首先需要創建時間區間的兩個邊界時間點:
>> tlower = datetime(2014,08,01) % 起點
>> tupper = datetime(2014,09,01) % 終點
tlower =
01-Aug-2014
tupper =
01-Sep-2014
然后創建一個datetime數組,然后判斷數組是否在所設定的時間區間內。
>> A = datetime(2014,08,21) + calweeks(0:2)
A =
21-Aug-2014 28-Aug-2014 04-Sep-2014
>> tf = isbetween(A,tlower,tupper)
tf =
1 1 0
【例3-50】 日期和時間數組的繪圖。
首先創建一個datetime數組作為x軸。
>> t = datetime(2014,6,28) + caldays(1:10);
將y軸數據定義一個隨機數組,然后繪制曲線。
>> y = rand(1,10);
>> plot(t,y);
得到的結果如圖3-8所示。
圖3-8 日期數組繪圖
在默認情況下,plot函數會基于數據的范圍自動選擇刻度線。當用戶放大或縮小圖形時,刻度線會自動隨之調整。另外用戶還可以自定義刻度線格式,例如通過下面的語句就可以將刻度線定義為日-月-年的格式。
>> plot(t,y,'DatetimeTickFormat','dd-MMM-yyyy')
得到的結果如圖3-9所示。
圖3-9 指定刻度線格式
對于duration數組來說也可以使用類似的方式進行繪圖。
首先創建一個duration數組,例如以30秒為步長,總時間3分鐘的一個數組:
>> t = 0:seconds(30):minutes(3);
同時創建隨機數組作為y軸數據:
>> y = rand(1,7);
在繪圖過程中可以指定橫軸刻度均以秒為單位:
>> h = plot(t,y,'DurationTickFormat','s');
得到的結果如圖3-10所示。
7.4 日期和時間作為數值和字符
如果用戶在使用2014a及以前版本,或者和其他使用之前版本的人共享代碼時,這就需要處理存儲為雙精度數值或字符串形式的日期和時間數據。此外,用數值形式表示的日期和時間還可以適用于一些不接受datetime和duration數據類型的函數。
盡管datetime數組是表達時間點的最佳數據類型,但用戶還可以通過以下三種形式來表示日期和時間:
(1)Date String:字符串,例如Thursday, August 23, 2012 9:45:44.946 AM
(2)Date Vector:一個1×6的數值向量,包含了年、月、日、時、分、秒,例如[2012 8 23 9 45 44.946]
(3)Serial Date Number — 一個數值,從January 0, 0000開始計算,例如7.3510e+005
采用元胞數組、矩陣等可以以數組形式存儲上述各種類型日期時間數據。
用戶可以使用datetime函數將上述類型數據轉換為datetime數組。反過來,用戶可以分別使用datenum、datevec或datestr函數將datetime數組轉換為日期數值、日期向量或者日期字符串類型。
日期字符串就是由表示日期或者時間的字符組成,可以有多種格式,例如下面的字符串都是表示August 23, 2010 at 04:35:42 PM:
'23-Aug-2010 04:35:06 PM'
'Wednesday, August 23'
'08/23/10 16:35'
'Aug 23 16:35:42.946'
用戶可以采用12時制或者24時制來進行記錄。在記錄的字符串中還可以加入連字符、空格、冒號來分割各個元素。例如:
>> d = '23-Aug-2010 16:35:42'
【例3-51】 日期字符串的轉換。
使用datetime函數可以將字符串轉換為datetime數組。由于輸入字符串格式可能有很多種,用戶最好指明輸入字符串的格式從而提高運行效率。
>> t = datetime(d,'InputFormat','dd-MMM-yyyyHH:mm:ss:')
t =
23-Aug-2010 16:35:42
盡管日期字符串d和datetime標量t看起來非常相似,但是二者是不相同的。
>> whos d t
Name Size Bytes Class Attributes
t 1x1 121 datetime
d 1x20 40 char
日期向量就是一個1×6的雙精度數值的數組,其中的數值除了秒以外都是整數,采用24時制的形式來表示。日期向量采用年月日時分秒的順序來進行記錄。例如[2012 10 24 10 45 07]表示的是10:45:07AM on October 24, 2012。
【例3-52】 日期向量的轉換。
使用datetime函數將日期向量[2012 10 24 10 45 07]轉換為datetime數組。
>> t = datetime([2012 10 24 10 45 07])
t =
24-Oct-2012 10:45:07
連續日期數值表示的是距離計時起點過去了多少天。在MATLAB里面,這個起點日期是January 0, 0000。日期數值通過小數來表示不滿一天的情況,例如6 p.m等于0.75天。所以采用日期數值來表示'31-Oct-2003, 6:00 PM' 的話那就是731885.75。
【例3-53】 日期數值的轉換。
使用datetime函數將日期數值轉換為datetime數組。
>> t =datetime(731885.75,'ConvertFrom','datenum')
t =
31-Oct-2003 18:00:00
【例3-54】 將datetime數組轉換為日期數值。
一些MATLAB函數只接受日期數值輸入但并不接受datetime數組輸入。如果想要調用這些函數的話,那么就需要將datetime數組轉換為日期數值格式,然后再調用函數。例如log函數只接受數值格式輸入,不接受datetime數組。
假設用戶有一datetime數組表示了一項實驗的時間數據:
>> t = datetime('18-Jun-2014') +calmonths(1:4)
t =
18-Jul-2014 18-Aug-2014 18-Sep-2014 18-Oct-2014
減去實驗開始的時間就可以得到該時間點對應的實驗所花時間長度:
>> dt = t - '1-Jul-2014'
dt =
408:00:00 1152:00:00 1896:00:00 2616:00:00
dt是一個duration數組。將dt使用years、days、hours、minutes或seconds轉換為統一單位的數值,例如:
>> x = hours(dt)
x =
408 1152 1896 2616
將此雙精度數組輸入到log函數中就可以進行相應的計算:
>> y = log(x)
y =
6.0113 7.0493 7.5475 7.8694
總結
以上是生活随笔為你收集整理的matlab 日期加小时数_MATLAB时间与日期的基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: englishpod主持人对话文本_En
- 下一篇: matlab人脸追踪,求大神帮助我这个菜