我有一个包含日期格式字符串的单元格数组,我想将整个数组转换为日期时间数组。问题是有些字符串包含小数秒(精度不同),而有些则不包含,如下所示:
my_date_strings{1} = '2022-01-15T14:04:58.23Z' ;
my_date_strings{2} = '2022-01-15T14:19:28Z' ;
my_date_strings{3} = '2022-01-08T09:43:24.702Z' ;
my_datetime = datetime(my_date_strings, 'InputFormat','yyyy-MM-dd''T''HH:mm:ss.SS''Z''' );
如何指定日期时间的输入格式,使其能够处理这两种类型?(理想情况下,我希望忽略每个元素上的小数秒,但是可以使用输入格式说明符吗?).
4条答案
按热度按时间piv4azn71#
Regexp很难。
erase
使用pattern
更容易。jv2fixgn2#
您可以填充缺少小数秒的字符串,使其以
.00
结尾,然后格式保持一致。如果你知道my_date_strings
的每个元素都以':ss.SSZ'
或':ssZ'
结尾,那么你可以检查小数点后3个字符,如果缺少,用.00Z
替换'Z'
。这可能看起来像:如果小数点后的位数可以变化,那么你需要稍微复杂一些的东西。您可以将“填充”定义为
'.000Z'
,并计算出每个日期字符串需要多少个填充字符。然后在末端粘上那么多填充物。我认为最清晰的方法是在一个小循环中,注意到在您定义的格式中,一个“完整的”3位小数的日期字符串有24个字符:rsl1atfo3#
下面是另一种方法,基于使用非常简单的正则表达式将字符串拆分为相关部分。这对小数点的数量没有限制。
1.使用
regexp
匹配每个字符串中包含一个或多个除'-'
、'T'
、':'
或'Z'
之外的字符的部分。对于每个字符串,这将产生6个子字符串,对应于年,月,日,小时,分钟和秒,后者将包含小数部分,如果它存在的话。由于regexp
的工作方式,结果是单元阵列的单元阵列。1.使用
vertcat
和comma-separated列表转换为二维非嵌套单元数组。现在每一行都引用一个原始字符串,每一列都是它的6个子字符串之一。1.使用
str2double
将每个子字符串转换为数字。这给出了6列的数字矩阵。1.使用
num2cell
将矩阵分成6列的单元数组。1.将逗号分隔的6列列表作为输入传递给
datetime
,以生成所需的输出。请注意,尽管默认显示方法不指示秒的分数,
他们确实在那里:
mo49yndu4#
使用
textscan
保留小数秒: