如何按小时对 HKStatistics 进行分组?

Posted

技术标签:

【中文标题】如何按小时对 HKStatistics 进行分组?【英文标题】:How to group HKStatistics by hour? 【发布时间】:2014-10-10 12:12:28 【问题描述】:

我正在尝试从 HealthKit 中提取步数数据。

我想创建按小时分组的步骤数据摘要。目前,我可以提取NSPredicateHKSampleQuery 提供的日期范围之间的所有数据样本。我还可以获得HKStatisticsQuery 的日期范围之间的步数总和。

我要问的是是否有办法按小时对样本或统计数据进行汇总。在 SQL 中,我会这样写:

SELECT HOUR(date), SUM(steps) FROM healthkit WHERE date BETWEEN 'blah' AND 'blah' GROUP BY 1;

我真的要查询 HKStatistics 24 x 31 次才能写入按小时分组的最后一个月的步数数据吗?因为这看起来相当低效,尤其是resultsHandler 的实现方式。

【问题讨论】:

【参考方案1】:

您应该使用HKStatisticsCollectionQuery,您可以在其中按时间间隔执行分组。一个示例存根代码是:

NSDate *startDate, *endDate, *anchorDate; // Whatever you need in your case    
HKQuantityType *type = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];

// Your interval: sum by hour
NSDateComponents *intervalComponents = [[NSDateComponents alloc] init];
intervalComponents.hour = 1;

// Example predicate
NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:fromDate endDate:toDate options:HKQueryOptionStrictStartDate];

HKStatisticsCollectionQuery *query = [[HKStatisticsCollectionQuery alloc] initWithQuantityType:type quantitySamplePredicate:predicate options:HKStatisticsOptionCumulativeSum anchorDate:anchorDate intervalComponents:intervalComponents];
    query.initialResultsHandler = ^(HKStatisticsCollectionQuery *query, HKStatisticsCollection *result, NSError *error) 
        // do something with the results
    ;
[healthStore executeQuery:query];

您可以在HKStatisticsCollectionQuery docs阅读更多详细信息

【讨论】:

正是我想要的。谓词可能不是必需的,因为在initialResultsHandler 内部有一个称为enumerateStatisticsFromDate: toDate: 的方法。我想知道结果对象是否只是一个数据库指针,或者查询是否将所有数据加载到内存中? Apple 的文档似乎使用了 nil 谓词。 @AndyM 看起来为谓词传递 nil 会返回所有数据,因此最好先使用开始/结束日期运行谓词,以便 enumerateStatisticsFromDate:toDate 具有较小的数据集来过滤。 developer.apple.com/library/ios/documentation/HealthKit/…:

以上是关于如何按小时对 HKStatistics 进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django 查询集按小时对对象进行分组?

如何使用带有 Pandas 的时间戳按小时对数据帧进行分组

使用 Python,如何按小时对 Dataframe 中的列进行分组?

SQL Server 按过去 24 小时、上周和上个月对促销进行分组,并按周降序排序

计算记录并按小时对它们进行分组

Laravel 每天按奇数小时对数据进行分组