【问题标题】:Matlab: How to compare dates (YMD) while ignoring time (HMS)?Matlab:如何在忽略时间(HMS)的情况下比较日期(YMD)?
【发布时间】: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


【解决方案1】:

您可以使用 DATESHIFT 函数将所有日期移到一天的开始,然后进行比较。

ismember(dateshift(arDt1,'start','day'),dateshift(arDt2,'start','day'))
ans =

  1×10 logical array

   1   0   1   0   1   0   1   0   1   0

【讨论】:

  • 谢谢。到目前为止完全错过了那个。
【解决方案2】:

另一种解决方案是直接使用datetime 的属性。意思是比较年、月和日的属性。我更喜欢这种方法,因为它允许我例如过滤给定月份(忽略一天)。

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

arDtYMD1 = [arDt1.Year', arDt1.Month', arDt1.Day'];     % 10x3 double
arDtYMD2 = [arDt2.Year', arDt2.Month', arDt2.Day'];     % 5x3 double
all(ismember(arDtYMD1, arDtYMD2),2)                     % 10x1 logical array

【讨论】:

  • 谢谢。这在其他情况下也将非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 2016-11-11
  • 2011-10-25
  • 2012-05-08
  • 1970-01-01
  • 2016-02-14
相关资源
最近更新 更多