How to erase a specific elements for the name of string values and then replace them?

3 views (last 30 days)
Hello everyone,
I have names of values in this form:
dd_mm_yy_hh_mm_ss
for example:
Temp_06_02_24_10_39_34 = 32;
I would like to select only the number for the month (02) and replace it with the coresponding name of month in order to creat new value, for example:
Temp_Feb = 32;
How can I do this ?
Best regards, Ahmad
  3 Comments
Stephen23
Stephen23 on 17 Apr 2024
Edited: Stephen23 on 17 Apr 2024
Very bad data design has meta-data (e.g. dates) in variable names. Such badly-designed data will force you into writing slow, complex, inefficient, obfuscated code that is fragile/buggy and hard to debug. Best avoided:
Learn to use arrays.

Sign in to comment.

Accepted Answer

Adam Danz
Adam Danz on 17 Apr 2024
Edited: Adam Danz on 17 Apr 2024
Assumptions:
  • "Temp_06_02_24_10_39_34 = 32"; is a string
  • This is not a variable name
  • The month is in the 2nd numeric position (02, above)
  • The goal is to replace the entire day_month_year_hour_minute_second datetime with the 3-letter abbreviation for the month.
str = "Temp_06_02_24_10_39_34 = 32;";
% Extract the month number and convert to short month name
[~,dtParts] = regexp(str, '_(\d+)','match','tokens');
monthStr = month(datetime(str2double([dtParts{:}])),'shortname');
% Replace the datetime portion with the short month name
newStr = regexprep(str, '(_\d+){6}',['_',monthStr{1}])
newStr = "Temp_Feb = 32;"
  4 Comments
Stephen23
Stephen23 on 18 Apr 2024
Here is an approach using a dynamic regular expression. This avoids the extra REGEXP and MONTH function calls.
str = "Temp_06_02_24_10_39_34 = 32;";
fnh = @(s)char(datetime(s,'InputFormat','_dd_MM_yy_hh_mm_ss','Format','MMM'));
new = regexprep(str,'(_\d+){6}','_${fnh($0)}')
new = "Temp_Feb = 32;"

Sign in to comment.

More Answers (1)

Jon
Jon on 17 Apr 2024
I would suggest in general that you not embed the date time data in the variable name. Instead use a table, timetable, or some other data structure to hold these values along with the temperatures. Here's a little example using just a MATLAB table
% Make example table to hold data
yyyy = [2023,2023,2023,2024]'
yyyy = 4x1
2023 2023 2023 2024
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
mm = [8,4, 2, 3 ]'
mm = 4x1
8 4 2 3
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
dd = [15,18,6, 2]'
dd = 4x1
15 18 6 2
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
hh = [9,13,8,23]'
hh = 4x1
9 13 8 23
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
mi = [15,18,59,42]'
mi = 4x1
15 18 59 42
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
sec = [11,22,19,49]'
sec = 4x1
11 22 19 49
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
T = [29,15.3,22, 36.4]'
T = 4x1
29.0000 15.3000 22.0000 36.4000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
time = datetime(yyyy,mm,dd,hh,mi,sec);
Tdata = table(time,T)
Tdata = 4x2 table
time T ____________________ ____ 15-Aug-2023 09:15:11 29 18-Apr-2023 13:18:22 15.3 06-Feb-2023 08:59:19 22 02-Mar-2024 23:42:49 36.4
% Find the temperature for February (month = 2)
idl = month(Tdata.time) == 2;
Tdata.T(idl)
ans = 22
  9 Comments
Jon
Jon on 17 Apr 2024
Here is an approach for extracting the month from a string with day month year ..and then creating a new string with just the month
s1 = 'Temp_15_05_24_10_44_22'
s1 = 'Temp_15_05_24_10_44_22'
time = datetime(s1(6:end),'InputFormat','dd_MM_yy_HH_mm_ss')
time = datetime
15-May-2024 10:44:22
mname = month(time,"shortname");
s2 = "Temp_" + mname{1}
s2 = "Temp_May"

Sign in to comment.

Products


Release

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!