Matlab Novice here - struggling to truncate a column array
조회 수: 24 (최근 30일)
이전 댓글 표시
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
Bob Thompson
2019년 6월 10일
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.
채택된 답변
Steven Lord
2019년 6월 10일
편집: Steven Lord
2019년 6월 10일
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.)
추가 답변 (1개)
Jan
2019년 6월 10일
cellfun(@(x) x(18:19), C, 'UniformOutput', false)
댓글 수: 5
Steven Lord
2019년 6월 11일
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.
참고 항목
카테고리
Help Center 및 File Exchange에서 Data Type Conversion에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!