MATLAB 绘制移动调用图
MATLAB ploting mobile call graph
我有包含 3.850.000 个条目的 csv 文件。
来源、目标、日期、时间
例如7bc65f6f4342d49242514a50ce53d71d,555af6d82bb7f4c7475f7af29e8db147,2016-02-29,23:51:00
我可以在 matlab 中绘制这个 csv 文件吗?我曾尝试使用 excel,但它可以处理的大多数条目是 105k...
我如何根据时间绘制日期,然后计算以下内容:
a) 每天拨打的电话数量
b) 星期一等电话的数量?
谁能给我指出正确的方向?我什至使用正确的工具来完成这样的任务吗?
谢谢!
这里有一些方向和建议。
第 1 部分
首先,您需要读取 csv 文件。以下代码应该可以用于您的应用程序。
filename = 'G:\Desktop\new\Book1.csv'; % specify your file name and directory
fileID = fopen(filename,'r','n','UTF-8'); % open file
try
format = '%s%s%{yyyy/MM/dd}D%{HH:mm:ss}D%[^\n\r]'; % format specification
data = textscan(fileID, format, 'Delimiter', ',', 'ReturnOnError', false); % read data
catch e
fclose(fileID); % close file
rethrow(e)
end
fclose(fileID); % close file
clearvars -except data % clear variables
[source, target, dateData, timeData] = data{:}; % load data
第 2 部分
由于您已将数据加载到 Matlab 中,您可以开始按日期对数据进行分组。您可以找到日期发生变化的行号:
iDate = find(diff(dateData) ~= 0); % locate where there is a change in date
iDate = [1, iDate(:)', numel(dateData)]; % add start and end
您可以使用类似的代码来及时发现变化。
然后你可以对你的数据进行分组:
for i = 1:numel(iDate) - 1
dataCollection{i}.date = dateData(iDate(i));
dataCollection{i}.source = source(iDate(i):iDate(i+1));
dataCollection{i}.target = target(iDate(i):iDate(i+1));
dataCollection{i}.timeData = timeData(iDate(i):iDate(i+1));
end
您可以在上面的循环中再添加一个循环,按时间对数据进行分组。例如:
for j = 1:numel(iTime) - 1
dataCollection{i}.timeCollection{j} = dataCollection{i}.source(iTime(j):iTime(j+1));
...% more data
end
接下来,您需要计算每个日期的数据数量,如果需要,还需要计算时间。此代码可以插入现有循环中:
dataCollection{i}.dataNum = numel(dataCollection{i}.source);
dataCollection{i}.timeCollection{j}.dataNum = numel(dataCollection{i}.timeCollection{j}.source);
最后,您可以绘制曲线并将 x 标签替换为日期、时间或周等。
第 2 部分 - 备选方案
通过以上内容,您可以构建一个非常好的结构来保存您的数据。如果不需要这个,代码可以简单很多:
iDate = find(diff(dateData) ~= 0); % locate where there is a change in date
iDate = [1, iDate(:)', numel(dateData)]; % add start and end
dataNumByDate = diff(iDate); % calculate the number of data for each date
xLabelStr = datestr(dateData(iDate(2:end))); % convert date into string for x labels
然后绘制图形。无需循环。
如果您对代码的特定部分有疑问,我建议您打开一个新问题。
我有包含 3.850.000 个条目的 csv 文件。 来源、目标、日期、时间 例如7bc65f6f4342d49242514a50ce53d71d,555af6d82bb7f4c7475f7af29e8db147,2016-02-29,23:51:00
我可以在 matlab 中绘制这个 csv 文件吗?我曾尝试使用 excel,但它可以处理的大多数条目是 105k... 我如何根据时间绘制日期,然后计算以下内容: a) 每天拨打的电话数量 b) 星期一等电话的数量?
谁能给我指出正确的方向?我什至使用正确的工具来完成这样的任务吗? 谢谢!
这里有一些方向和建议。
第 1 部分
首先,您需要读取 csv 文件。以下代码应该可以用于您的应用程序。
filename = 'G:\Desktop\new\Book1.csv'; % specify your file name and directory
fileID = fopen(filename,'r','n','UTF-8'); % open file
try
format = '%s%s%{yyyy/MM/dd}D%{HH:mm:ss}D%[^\n\r]'; % format specification
data = textscan(fileID, format, 'Delimiter', ',', 'ReturnOnError', false); % read data
catch e
fclose(fileID); % close file
rethrow(e)
end
fclose(fileID); % close file
clearvars -except data % clear variables
[source, target, dateData, timeData] = data{:}; % load data
第 2 部分
由于您已将数据加载到 Matlab 中,您可以开始按日期对数据进行分组。您可以找到日期发生变化的行号:
iDate = find(diff(dateData) ~= 0); % locate where there is a change in date
iDate = [1, iDate(:)', numel(dateData)]; % add start and end
您可以使用类似的代码来及时发现变化。
然后你可以对你的数据进行分组:
for i = 1:numel(iDate) - 1
dataCollection{i}.date = dateData(iDate(i));
dataCollection{i}.source = source(iDate(i):iDate(i+1));
dataCollection{i}.target = target(iDate(i):iDate(i+1));
dataCollection{i}.timeData = timeData(iDate(i):iDate(i+1));
end
您可以在上面的循环中再添加一个循环,按时间对数据进行分组。例如:
for j = 1:numel(iTime) - 1
dataCollection{i}.timeCollection{j} = dataCollection{i}.source(iTime(j):iTime(j+1));
...% more data
end
接下来,您需要计算每个日期的数据数量,如果需要,还需要计算时间。此代码可以插入现有循环中:
dataCollection{i}.dataNum = numel(dataCollection{i}.source);
dataCollection{i}.timeCollection{j}.dataNum = numel(dataCollection{i}.timeCollection{j}.source);
最后,您可以绘制曲线并将 x 标签替换为日期、时间或周等。
第 2 部分 - 备选方案
通过以上内容,您可以构建一个非常好的结构来保存您的数据。如果不需要这个,代码可以简单很多:
iDate = find(diff(dateData) ~= 0); % locate where there is a change in date
iDate = [1, iDate(:)', numel(dateData)]; % add start and end
dataNumByDate = diff(iDate); % calculate the number of data for each date
xLabelStr = datestr(dateData(iDate(2:end))); % convert date into string for x labels
然后绘制图形。无需循环。
如果您对代码的特定部分有疑问,我建议您打开一个新问题。