【问题标题】:Matlab filtering records by dateMatlab按日期过滤记录
【发布时间】:2020-08-17 22:07:29
【问题描述】:

我是 Matlab 的一个小菜鸟,我的作业遇到了一些麻烦

我的 Excel 看起来像这样:

Date          column A         column B
1/1/2015     (double)         (double)
5/1/2015     (double)         (double)
6/1/2015     (double)         (double)
12/2/2015     (double)         (double)
13/2/2015     (double)         (double)
15/3/2015     (double)         (double)
11/4/2015     (double)         (double)
12/4/2015     (double)         (double)
13/4/2015     (double)         (double)
11/5/2015     (double)         (double)
13/5/2015     (double)         (double)
11/6/2015     (double)         (double)
11/7/2015     (double)         (double)
11/8/2015     (double)         (double)
11/9/2015     (double)         (double)
11/10/2015     (double)         (double)
11/11/2015     (double)         (double)
11/12/2015     (double)         (double)
.
########(string?) ...          ...
########(string?) ...          ...
15/8/2018         ...          ...
.
.
.

我导入并转换成表格,现在我需要过滤它,只留下每个季度的第一天。

由于 Matlab 与 MySQL、java 之类的东西如此不同,我以前学过的东西而且我没有太多时间,我在这种绝望的情况下感到恐慌(这只是我家庭作业的开始!),所以我真的需要一些帮助。

我不熟悉语法,这是我第一次提出问题,如果我问了一些愚蠢的问题,对不起。

【问题讨论】:

  • 我希望至少能得到一些提示,比如有没有类似于 str.contains("xxx") 的语法,或者 Select from where like '%xx%'
  • 欢迎来到 SO!请添加一些示例,说明您的数据集是什么样的以及您的预期结果是什么样的。这将帮助我们帮助您:) 由于 Matlab 不是数据库类型的编程语言,您需要读取数据,然后对您需要的逻辑进行编程。从这个问题来看,“你需要的逻辑”不是很清楚。
  • 因为@CibinJoseph 告诉我我不够清楚我添加了几行,excel 有大约数千行这样的行,几年,我只是想按日期过滤它,只保留一个季节的第一天,例如 Jan Apr Jul sep 的 1st,但不是每个季节都有 1st,它可能从 3rd 或任何日期开始
  • 不需要一行完成,但最好不要太复杂,因为我对Matlab不太熟悉,请不要循环每条记录,使用过滤功能
  • 必要时可以添加新列

标签: matlab select filtering contains


【解决方案1】:

您可以使用 Matlab 中的datetime 类来比较日期。

假设:
1. 您的日期格式为dd/MM/yyyy
2. 从 Excel 打印时,第 1 列中的日期已经排序
3.标题为data.csv的csv文件的分隔符是空格,
下面的 sn-p 应该打印出每个季度的第一个出现日期的列。

clc; clear;

fid = fopen('data.csv');

% Retrieve data from file
data = textscan(fid, '%s %s %s', 'delimiter', ' ');

% Convert string to date objects 
% that enables date comparison
datesArray = datetime(data{1}, 'InputFormat', 'dd/MM/yyyy');

% Define start and end dates of each quarter
QstartDayMonth = ['01/01'; '01/04'; '01/07'; '01/10'];
QendDayMonth   = ['31/03'; '30/06'; '30/09'; '31/12'];

% Parse data to extract seasonal firsts
quart = 1;
for i = 1:length(datesArray)
  % Obtain year
  currentDate = datesArray(i);
  currentYear = num2str(currentDate.Year);

  % Define start date of current year's quarter
  quarterStart = strcat(QstartDayMonth(quart, :), '/', currentYear);
  quarterEnd   = strcat(QendDayMonth(quart, :)  , '/', currentYear);
  quarterStart = datetime(quarterStart, 'InputFormat', 'dd/MM/yyyy');
  quarterEnd   = datetime(quarterEnd, 'InputFormat', 'dd/MM/yyyy');

  % Check if current date lies in chosen quarter
  if (currentDate >= quarterStart)
    disp([data{1}{i}, '  ', data{2}{i}, '  ', data{3}{i}]);

    % If it does, advance the quarter to be checked
    quart = quart + 1;
    if (quart > 4)
      quart = 1;
    end
    continue;
  end
end
fclose(fid);

【讨论】:

  • csv 中的日期是 dd/MM/yyyy,但我发现转换为表格时会是 yyyy-mm-dd
  • 我真的需要使用 for 循环还是可以通过 find(contains()) 或 table.value(continas()) 完成?,我自己尝试了,我得到了错误不知道怎么处理
  • 无法使用格式 'yyyy-mm-dd' 将文本转换为日期时间。错误 datesArray = datetime(data{1}, 'InputFormat', 'dd/MM/yyyy');
  • 这可以用 readtable() 对象来完成吗?顺便说一句,谢谢帮助
【解决方案2】:
table = readtable("a.csv");
table= table(month(table.Date)==4 | month(table.Date)==7 | month(table.Date)==10 | month(table.Date)==1, :);

刚刚找到一种可以过滤特定月份的方法

现在我只需要保留一个月的第一天并删除所有其他天

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 2021-11-20
    • 2013-06-23
    相关资源
    最近更新 更多