【发布时间】:2021-09-16 21:40:28
【问题描述】:
对于具有日期时间值的两个数组(不同长度),我想标记那些日期(年、月、日)相同的条目同时忽略时间值。问题是datetime 类型在内部也总是包含一个时间(即使构造函数datetime(Y,M,D) 会在内部将时间设置为00:00:00)。因此,仅当时间也相同时,直接比较日期时间 (dt1 == dt2) 将得出true。
例如:
arDt1 = datetime(2021,5,1:10,0,0,0); % 1. to 10. May, always at time 00:00:00
arDt2 = datetime(2021,5,1:2:10,12,0,0); % 1.,3.,5.,7.,9. May always at time 12:00:00
因此,arDt1 所需的标志逻辑数组将是
[ 1 0 1 0 1 0 1 0 1 0] % days in arDt1 which are also in arDt2, *never mind the time*
实际数据跨越多个月和年,因此仅使用月份数字是不够的(即使对于上面的示例也是如此)。
我可以想到各种解决方法(将日期时间转换为字符串并进行解析;使用ymd(),然后“分段”比较年、月、日;或强制所有时间(至少暂时)相同,例如00:00:00),但这一切都变得有点笨拙,尤其是。当涉及到不同长度的数组时,这意味着必须使用ismember() 而不是直接的一对一数组比较。
只处理datetime值的日期部分而不考虑时间部分的问题应该是一个相当普遍的问题,但我找不到任何示例或参考。有人可以建议一种更优雅/更有效的方法吗?
【问题讨论】:
-
你不能只转换为
datenum然后floor并使用ismember吗?ismember(floor(datenum(arDt1)), floor(datenum(arDt2))) -
是的,谢谢! -- 我知道一定有一些简单的东西。 :-) 我已经检查了
datenum,希望“仅是一整天”(文档说它“将每个时间点表示为从 0000 年 1 月 0 日开始的天数。”),但后来发现它也包含一天的一小部分,所以(过早地)放弃了它,而不是考虑 floor()。此外,我认为无论如何都不再推荐datenum(文档说“表示时间点的最佳方法是使用datetime数据类型”)。但是对于这个特定的目的,它是正确的,当然。
标签: matlab datetime comparison