Removing Rows from Array Based on Date/Time Value in Cell
Mostra commenti meno recenti
I am trying to remove all lines of data for whom the "last order date" (row 17 of my CSV file) is after 8/31/2019. My code was weeding out some, but there were a few later dates left behind. I switched all the date values to Serial Date Numbers in hopes that would simplify the process, but it's still not weeding out anything after 7183 (the serial date number for 8/31/19). I am out of ideas and would greatly appreciate any feedback.
Code:
segment = readtable('myFile.csv');
a = 1;
rows = height(segment);
newDate = [];
for f = 1:rows
addDate = datenum(segment{f, 17});
newDate(f) = addDate;
end
cutoffDateOG = datetime('08/31/0019','InputFormat','MM/dd/uuuu', 'Format', 'preserveinput');
cutoffDate = datenum(cutoffDateOG);
while a < rows
if newDate(a)>cutoffDate || isnat(segment{a,17}) == 1
segment(a,:) = [];
rows = rows-1;
end
a = a+1;
end
end
Risposta accettata
Più risposte (1)
Cris LaPierre
il 29 Lug 2020
0 voti
Don't use datenums. I would suggest converting your dates to datetimes (segment{f,17}). Then you can just use regular conditional expressions (>,<.==,etc.).
4 Commenti
Cris LaPierre
il 29 Lug 2020
It is likely we can be of more help if you attach your data file.
Liza Miller
il 29 Lug 2020
Modificato: Liza Miller
il 29 Lug 2020
Cris LaPierre
il 29 Lug 2020
Modificato: Cris LaPierre
il 29 Lug 2020
You may be making this more complicated than it needs to be. Without a representative data set, we can only guess, but I suspect something like this should work. Ignore the first few lines. I'm creating a dummy table of various data types for the example.
% Dummy data set including a range of dates including NaT entries.
Dates = [datetime(2019,01,01):days(1):datetime('today') repmat(NaT,1,24)];
segment = table(Dates',zeros(length(Dates),1),zeros(length(Dates),1,'single'),cell(length(Dates),1),strings(length(Dates),1));
segment.Properties.VariableNames=["Dates","Double","Single","Cell","String"];
% Specify the cutoff date
cutoffDate = datetime(2019,08,13);
% Remove rows where Dates has a value of NaT
segment=rmmissing(segment,"DataVariables","Dates")
% Remove rows where Date is after cut off date
segment(segment.Dates>cutoffDate,:)=[];
Since I start Dates on the first day of 2019, and since 8/13/2019 is the 225th day of the year (in 2019), the resulting size of segment should be a table with 225 rows and 5 columns.
day(cutoffDate,'dayofyear')
ans =
225
Liza Miller
il 30 Lug 2020
Modificato: Liza Miller
il 30 Lug 2020
Categorie
Scopri di più su Dates and Time in Centro assistenza e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!