从csv文件计算PHP中的平均持续时间。平均时间似乎为0毫秒
我有一个csv文件,其中包含以下值:从csv文件计算PHP中的平均持续时间。平均时间似乎为0毫秒,php,time,average,intervals,Php,Time,Average,Intervals,我有一个csv文件,其中包含以下值: Iteration, Duration 0,00:00:02.694414 81,00:00:02.790214 82,00:00:02.933225 83,00:00:03.077099 84,00:00:03.220184 85,00:00:03.363437 在它的第二列,我有一个H:I:s.ss格式的持续时间,我需要计算平均持续时间:sum(duration)/csv_size 为此,我使用此功能: /** * convert a DateTim
Iteration, Duration
0,00:00:02.694414
81,00:00:02.790214
82,00:00:02.933225
83,00:00:03.077099
84,00:00:03.220184
85,00:00:03.363437
在它的第二列,我有一个H:I:s.ss
格式的持续时间,我需要计算平均持续时间:sum(duration)/csv_size
为此,我使用此功能:
/**
* convert a DateTimeIntervalIn milliseconds
* @return int Time in miliseconds
*/
function intervalInMiliseconds(DateInterval $interval) : float
{
return ($interval->days*86400 + $interval->h*3600
+ $interval->i*60 + $interval->s)*1000 + ($interval->f*1000);
}
/**
* Undocumented function
*
* @return int
*/
function calculateAverageTime(string $csvFile)
{
if ( !file_exists($csvFile) ) {
throw new Exception('File not found.');
}
$file = fopen($csvFile,"r");
$count=0;
$duration= new DateTime('00:00');
$durationCalc= clone $duration;
while(($data = fgetcsv($file, 1000, ",")) !== FALSE){
$duration->add( DateInterval::createFromDateString($data[1]));
$count++;
}
if($count == 0)
{
throw new Exception("No Data In the CSV");
}
$duration=$duration->diff($durationCalc);
$averageSeconds=intervalInMiliseconds($duration)/$count;
fclose($file);
return $averageSeconds;
}
$time = calculateAverageTime(__DIR__.'/timestamps.csv');
echo $time;
但我的问题是如何将DateInterval
的格式设置为以毫秒为单位,以便能够计算出平均时间(以毫秒为单位),我得到0,这个结果对我来说似乎不正确。对于上面给出的数据,我期望毫秒的分数,但不是0
因此,你知道如何解决这个问题吗
编辑1:
显示一个快速的var_转储
var_dump($datetime);
显示将timestapms解析为DateInterval时失败:
class DateInterval#1 (16) {
public $y =>
int(0)
public $m =>
int(0)
public $d =>
int(0)
public $h =>
int(0)
public $i =>
int(0)
public $s =>
int(0)
public $f =>
double(0)
public $weekday =>
int(0)
public $weekday_behavior =>
int(0)
public $first_last_day_of =>
int(0)
public $invert =>
int(0)
public $days =>
bool(false)
public $special_type =>
int(0)
public $special_amount =>
int(0)
public $have_weekday_relative =>
int(0)
public $have_special_relative =>
int(0)
}
那么如何将时间戳从csv转换为DateInterval呢?用毫秒/微秒与DateTime求和时间可能会导致不准确。 我会完全按照@04FS评论中的建议去做 原则:
$durations = [
"00:00:02.694414",
"00:00:02.790214",
"00:00:02.933225",
"00:00:03.077099",
"00:00:03.220184",
"00:00:03.363437"
];
$sum = 0.0;
foreach($durations as $duration){
list($h,$m,$s) = explode(':',$duration);
$sum += $h * 3600 + $m * 60 + $s;
}
$avg = $sum/count($durations);
echo $avg; //3.0130955
该函数可用于从二维数组(csv)中提取持续时间。用毫秒/微秒与DateTime求和时间可能会导致不准确。 我会完全按照@04FS评论中的建议去做 原则:
$durations = [
"00:00:02.694414",
"00:00:02.790214",
"00:00:02.933225",
"00:00:03.077099",
"00:00:03.220184",
"00:00:03.363437"
];
$sum = 0.0;
foreach($durations as $duration){
list($h,$m,$s) = explode(':',$duration);
$sum += $h * 3600 + $m * 60 + $s;
}
$avg = $sum/count($durations);
echo $avg; //3.0130955
该函数可用于从二维数组(csv)中提取持续时间。首先尝试通过DateTime和Interval处理这一点有意义吗…?我会抓取
00:00:02.694414
值,在冒号处拆分,然后从中计算相应的秒值。有些人实际上也在00:02:10.586603
中。是的,那就是0*60*60+2*60+10.586603
秒那么…首先尝试通过DateTime和interval来处理这个问题有意义吗…?我会抓取00:00:02.694414
值,在冒号处拆分,然后从中计算相应的秒值。有些人实际上也在00:02:10.586603
中。是的,那就是0*60*60+2*60+10.586603
秒…