【问题标题】:Logically index Data based upon two date time arrays in matlab基于matlab中的两个日期时间数组逻辑索引数据
【发布时间】:2015-05-11 13:51:46
【问题描述】:

我将直接进入一个最小的例子,因为我觉得这很难用语言表达。我有以下示例:

Data.Startdate=[datetime(2000,1,1,0,0,0) datetime(2000,1,2,0,0,0) datetime(2000,1,3,0,0,0) datetime(2000,1,4,0,0,0)];
Data.Enddate=[datetime(2000,1,1,24,0,0) datetime(2000,1,2,24,0,0) datetime(2000,1,3,24,0,0) datetime(2000,1,4,24,0,0)];
Data.Value=[0.5 0.1 0.2 0.4];
Event_start=[datetime(2000,1,1,12,20,0) datetime(2000,1,1,16,0,0) datetime(2000,1,4,8,0,0)];
Event_end=[datetime(2000,1,1,14,20,0) datetime(2000,1,1,23,0,0) datetime(2000,1,4,16,0,0)];

如果 Data.Startdate 和 Data.Enddate 之间的任何时间介于 Event_start 和 Event_end 之间,我想要做的是向数据结构添加一个标志(比如 1)。在上面的示例中,Data.Flag 将具有值 1 0 0 1,因为从 Event_start 和 Event_end 向量中您可以看到 1 月 1 日和 1 月 4 日有事件。我的想法是我将使用这个标志来进一步处理数据。

我相信这很简单,但如果你能提供任何帮助,我将不胜感激。

【问题讨论】:

    标签: matlab datetime indexing logical-operators


    【解决方案1】:

    我会使用datenum 将日期转换为数字,然后使用bsxfun 进行相当方便的比较:

    isStartBeforeEvent = bsxfun(@gt,datenum(Event_start)',datenum(Data.Startdate));
    isEndAfterEvent = bsxfun(@lt,datenum(Event_end)',datenum(Data.Enddate));
    
    flag = any(isStartBeforeEvent & isEndAfterEvent, 1)
    

    【讨论】:

    • 您好,感谢您的回答,但如果 Event_start 和 Data.Startdate 有不同的维度怎么办?很抱歉没有在我的原始帖子中澄清这一点。
    • @user1912925:只要两者都是行向量,我的代码就不应该关心(因为您的示例具有不同数量的事件和日期,我什至能够对其进行测试)。 bsxfun 行将所有开始/结束相互比较,创建两个 nEvents-by-mDates 数组以供进一步处理。
    • 奇怪我收到 bsxfun 错误“两个输入数组的非单一维度必须相互匹配”(在我的“真实案例”中,Data.Startdate 是 1 x 863,Event_start 是 340 x 1或 1 x 340 后像您在示例中所做的那样转置它)。我看不出我的真实案例与上面使用您的解决方案确实有效的最小示例之间没有其他区别。
    • @user1912925:在您的示例中,两者都是 1×n,这需要我转置事件。如果事件是 n×1,不要转置,一切正常。
    猜你喜欢
    • 2015-09-20
    • 2014-11-05
    • 2014-04-16
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多