Matlab Novice here - struggling to truncate a column array
24 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Alex Herron
el 10 de Jun. de 2019
Currently working with a large data set, where one of the columns is a time series of the following format: 1234567.0002.2018.0113
The first 7 digits are an ID number, the next 4 are hour and min, next 4 are year, and the last 4 are month and date. I want to shave this column down to just the month, as this is the only important data point at the moment.
After taking the column out of the original data table, I was able to shorten a single data point, but couldn't apply the same thing to the entire column.
(C is the column)
ex: C{1,1}(18:19) yields the 01 for the first month
However, C{:}(18:19) yields the following error message: "Expected one output from a curly brace or dot indexing expression, but there were 78024 results."
Furthermore, C{1:78024, 18:19} yields "Index in position 2 exceeds array bounds (must not exceed 1)."
Not quite sure how to proceed, and any help is much appreciated!
2 comentarios
Bob Thompson
el 10 de Jun. de 2019
Are you cell contents stored as strings? I.e. is 123456.0002.2018.0113 actually '1234567.0002.2018.0113'? If so, I think you would be better off using regexp to split this all at once.
Unfortunately, the error you're running into is because you have your data stored in cells. Any time you have data elements that have non-singular contents working with multiple elements at once is tricky.
Respuesta aceptada
Steven Lord
el 10 de Jun. de 2019
Editada: Steven Lord
el 10 de Jun. de 2019
If the data is of a fixed with convert it from a cell array containing char vectors into a string array and use extractBetween.
data = {'1234567.0002.2018.0113'; ...
'8901234.0103.2018.0214'; ...
'8675309.0211.2018.0315'}
dataString = string(data)
monthdata = extractBetween(dataString, 19, 20)
You could convert the string array monthdata into a char array or even a double array.
Another alternative, depending on what you need to do with your time data, would be to extract the appropriate sections from dataString and turn them into a datetime array then ask for the month of that datetime array.
timeAndDateData = extractBetween(dataString, 9, 22)
dt = datetime(timeAndDateData, 'InputFormat', 'HHmm.yyyy.MMdd')
month(dt)
Once you have your datetime array you could consider turning your table into a timetable using table2timetable. This would allow you to perform certain date and time-related operations on the timetable like using retime to change the time basis (for instance, to make your data uniformly spaced in time.)
Más respuestas (1)
Jan
el 10 de Jun. de 2019
cellfun(@(x) x(18:19), C, 'UniformOutput', false)
5 comentarios
Steven Lord
el 11 de Jun. de 2019
Use:
find(cellfun(@isempty, data))
to locate cells that are empty. Or if you just want to eliminate those empty cells, omit the find and use the resulting logical array to delete the empty cells or keep the non-empty cells.
Ver también
Categorías
Más información sobre Data Type Conversion en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!