MATLAB绘制移动呼叫图

时间:2017-05-02 19:04:36

标签: matlab csv call-graph

我的csv文件包含3.850.000个条目。 源,目标日期,时间 例如7bc65f6f4342d49242514a50ce53d71d,555af6d82bb7f4c7475f7af29e8db147,2016-02-29,23:51:00

我可以在matlab中绘制这个csv文件吗?我曾尝试使用excel,但它可以处理的大多数条目是105k ... 我如何绘制日期与时间,然后计算如下的东西: a)每天进行的通话次数 b)星期一的电话号码等?

有人能指出我正确的方向吗?我甚至使用正确的工具来完成这项任务吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

以下是一些指示和建议。

第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

然后绘制数字。不需要循环。

如果您对代码的特定部分有疑问,建议您打开一个新问题。