# 如何标准化医疗数据

> 教程：将来自多个来源的医疗数据转换为一种可比较的形式 — LOINC 查询、UCUM 单位、ISO 日期、参考范围、重试时不重复，并根据欧洲实验室配置文件进行验证。

Source: https://developers.anpheros.com/zh/guides/normalize-medical-data

**标准化医疗数据意味着将以多种形式接收到的值转换为一种可比较的形式：相同的测试使用相同的代码，相同的单位系统，日期采用一种格式，每个值都附带其参考范围和来源，并且没有重复。**本教程演示了如何在数据进入 HL7 FHIR R4 记录之前执行此操作：查询 LOINC 和 ATC 代码，使用 UCUM 单位，拒绝模糊日期，保留范围，避免重试时重复，并根据欧洲实验室配置文件检查结果。所示的每个响应均来自 Anpheros API。

## 重要性

同样的 HbA1c 结果可能以多种形式出现，例如“HbA1c 6,4 %”、“Hemoglobina glicozilata: 6.4”、“Glycated haemoglobin 46 mmol/mol”或某个实验室独有的代码。在这些值统一为一个代码和单位之前：

- 患者 HbA1c 随时间变化的图表会显示三条不相关的线；
- 关于“HbA1c 高于 6.5 %”的警报会错过其中两个值；
- AI 模型会看到四个独立的事实，而不是一个趋势；
- 接收该记录的另一个系统无法对其进行解释。

标准化应在数据进入记录的入口点完成，只需一次，而不是在之后读取它的每个应用程序中都进行。

## 标准化值包含哪些部分

| 部分 | 标准化形式 | 示例 |
|---|---|---|
| 测量内容 | 来自标准系统的代码 | LOINC `4548-4` (HbA1c), RxNorm `6809` (metformin), ICD-10 `E11` (2型糖尿病) |
| 值 | 数字，或仅当结果非数字时的文本 | `6.4` |
| 单位 | UCUM | `%`, `mg/dL`, `mm[Hg]`, `kg` |
| 时间 | ISO 8601 日期时间，当时间很重要时包含时区 | `2026-10-01T07:30:00Z` |
| 正常范围 | 低值和高值，使用相同单位 | `4.0`–`5.6` |
| 来源 | 谁生成的以及来自哪个系统 | `import` 来自 `labx` |
| 标识 | 使重复项可识别的内容 | 幂等性键或源标识符 |

哪些代码系统与哪些资源类型对应，请参见 [FHIR 代码系统](https://developers.anpheros.com/zh/guides/fhir-code-systems)。

## 步骤 1：查找代码

通过英文或罗马尼亚文名称或缩写搜索平台的术语：

```bash
curl "https://platform.anpheros.com/v1/terminology/loinc?q=hba1c" -H "Authorization: Bearer $KEY"
curl "https://platform.anpheros.com/v1/terminology/loinc?q=hemoglobina%20glicozilata" -H "Authorization: Bearer $KEY"
```

两者都返回相同的概念：

```json
{"data": [{"system": "http://loinc.org", "code": "4548-4", "display": "Hemoglobin A1c/Hemoglobin.total in Blood",
           "display_ro": "Hemoglobină glicozilată (HbA1c)", "category": "laboratory", "unit": "%"}], "total": 1}
```

对于药品，[Anpheros Search](https://developers.anpheros.com/zh/guides/anpheros-search) 按名称或品牌查找物质，并提供其 RxNorm 成分代码和 EMA 产品编号：

```bash
curl "https://platform.anpheros.com/v1/search?q=metformin&type=treatment" -H "Authorization: Bearer $KEY"
```

`unit` 字段是 LOINC 为该测试期望的单位。使用它来检查您收到的内容。为每个源构建从其自身名称到代码的映射，每个源一次，并将其保存在您的集成中。不要在写入时猜测：当名称不明确且源中没有任何内容可以解决时，将其保留为未映射并询问源。[如何将实验室结果导入 FHIR 记录](https://developers.anpheros.com/zh/guides/import-lab-results-fhir) 显示了未映射的实验室标记如何保留和报告。

## 步骤 2：使用代码、单位和范围进行编写

```bash
curl -X POST "https://platform.anpheros.com/v1/patients/$PID/observations" -H "Authorization: Bearer $KEY" \
     -H "Content-Type: application/json" -H "Idempotency-Key: lab-77-hba1c" -d '{
  "code": "4548-4", "category": "laboratory",
  "value": 6.4, "unit": "%", "effective_at": "2026-10-01T07:30:00Z",
  "reference_range": {"low": 4.0, "high": 5.6},
  "author_type": "import"
}'
```

```json
{"id": "3296315c-…", "code": "4548-4", "system": "http://loinc.org", "display": "Hemoglobin A1c/Hemoglobin.total in Blood",
 "category": "laboratory", "effective_at": "2026-10-01T07:30:00Z", "value": 6.4, "unit": "%",
 "reference_range": {"low": 4.0, "high": 5.6}, "status": "final", "fhir": "Observation/3296315c-…"}
```

当您仅发送代码时，平台会在 REST API 和 FHIR API (`/fhir/R4`) 上填充标准的 LOINC 名称，以便所有应用程序读取相同的 `display`。您自己发送的 `display` 将保持不变。

请保留原始措辞。对于实验室报告，FHIR Observation 中的 `code.text` 会在实验室名称（“糖化血红蛋白 (HbA1c)”）旁边保留 LOINC 编码。患者仍然可以识别他们的纸质报告，并且如果映射受到质疑，也不会丢失任何信息。

## 步骤 3：单位

使用 UCUM 代码：`mg/dL`、`mmol/L`、`%`、`mm[Hg]`、`kg`、`cm`、`/min`、`Cel`。以下两条规则可防止大多数错误：

- **不要静默转换。** 如果实验室以 `mmol/L` 报告葡萄糖，而您的应用程序显示 `mg/dL`，请存储实验室测量的值，并在显示时进行转换。存储的值将保持可追溯到报告。
- **将单位与代码进行核对。** LOINC 代码是特定的：`%` 中的 HbA1c 是 `4548-4`，而 `mmol/mol` 中的 HbA1c 是一个不同的 LOINC 代码。单位与代码预期单位不匹配的值是映射错误，而不是转换问题。

Anpheros 不会为您转换单位；它会存储您发送的单位。

## 第 4 步：日期

在写入之前，请使用源已知格式将日期转换为 ISO 8601。`01.10.2026` 在罗马尼亚和许多欧洲国家表示 10 月 1 日，但 `10/01/2026` 仅在美国表示 10 月 1 日。API 会拒绝任何非 ISO 格式的内容，而不是进行猜测：

```json
{"error": {"type": "invalid", "message": "Input should be a valid datetime or date, invalid character in year (at effective_at)", "field": "effective_at"}}
```

实验室连接器是一个例外：它接受 `DD.MM.YYYY` 和 `DD/MM/YYYY`，因为它知道它正在读取一份欧洲报告。

对于一天中的时间很重要的测量值（血压、血糖、药物剂量），请发送带有时区的日期。布加勒斯特时间晚上 11:30 的读数在 UTC 时间是前一天，患者期望它显示在他们测量当天的日期。

## 步骤 5：无重复项

重复项可能源于重试、同一报告被发送两次以及同一值通过两条路径到达。

- **重试：**发送一个 `Idempotency-Key` 来标识源中的值，例如报告 ID 和测试。使用相同的密钥再次发送相同的请求将返回第一个响应，并且不会存储任何新内容。SDK 会在每次创建时加一。
- **同一报告两次：**实验室连接器根据报告、代码、日期和值构建每行的稳定标识符，并跳过已导入的行。
- **两条路径：**将源系统自己的 ID 存储在 `X-Anpheros-Origin-Id`（或 FHIR 资源上的 `identifier`）中，并在写入可能通过另一条路径返回的值之前进行搜索。

## 步骤 6：与配置文件进行检查

对于实验室结果，在依赖平台提供的资源之前，请询问平台该资源与 HL7 Europe 实验室报告配置文件相比如何：

```bash
curl -X POST "https://platform.anpheros.com/fhir/R4/Observation/\$validate?profile=eu-lab" -H "Authorization: Bearer $KEY" \
     -H "Content-Type: application/fhir+json" -d '{
  "resourceType": "Observation", "status": "final",
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "laboratory"}]}],
  "code": {"text": "HbA1c"}, "subject": {"reference": "Patient/'$PID'"},
  "valueQuantity": {"value": 6.4, "unit": "%"}
}'
```

此非标准化结果会得到一个精确的列表：

```json
{"resourceType": "OperationOutcome", "issue": [
  {"severity": "error", "code": "invalid", "diagnostics": "Observation.code must carry a LOINC coding.", "expression": ["Observation.code"]},
  {"severity": "error", "code": "required", "diagnostics": "Observation.effective[x] is required.", "expression": ["Observation.effective"]},
  {"severity": "warning", "code": "business-rule", "diagnostics": "valueQuantity should carry a UCUM system and code.", "expression": ["Observation.valueQuantity"]},
  {"severity": "warning", "code": "informational", "diagnostics": "No referenceRange: interpretation will need the laboratory's ranges.", "expression": ["Observation.referenceRange"]},
  {"severity": "information", "code": "informational", "diagnostics": "No performer (laboratory) recorded.", "expression": ["Observation.performer"]},
  {"severity": "information", "code": "informational", "diagnostics": "No issued time (when the laboratory released the result).", "expression": ["Observation.issued"]}]}
```

每个问题都对应上述步骤中的一个。在您的集成测试中运行 `$validate`，并使用来自每个源的真实样本。

## 步骤 7：保留来源

标准化会改变值的书写方式，但不会改变其来源。发送 `author_type`（`device`、`import`、`practitioner`、`patient`）和 `X-Anpheros-Source-System` 来进行每一次写入。这使得医生、审计员或 AI 模型能够区分实验室结果和在家中输入的数值。请参阅 [医学数据溯源详解](https://developers.anpheros.com/zh/guides/medical-data-provenance)。

## 检查清单

- [ ] 每个来源都有其名称到 LOINC / ATC / ICD-10 的映射，并保存在您的集成中
- [ ] 模糊的名称保持未映射状态并进行报告，绝不猜测
- [ ] UCUM 单位，与代码匹配；无静默转换
- [ ] ISO 8601 日期，在时间重要的位置包含时区
- [ ] 参考范围与实验室值一起保留
- [ ] 保留原始措辞 (`code.text`)
- [ ] 每次写入时都带有幂等性键或源 ID
- [ ] 每次写入时都带有 `author_type` 和源系统
- [ ] 测试中用于实验室结果的 `$validate`

## 常见问题解答

### 什么是医疗数据标准化？
将来自不同来源的健康数据转换为一种标准形式：共享代码（LOINC 用于测试和测量，ICD-10 用于诊断，ATC 用于药物），UCUM 单位，ISO 日期，参考范围和记录的来源，以便可以比较、合并和交换来自不同系统的值。

### 我应该将所有值转换为一个单位吗？
只要单位是有效的 UCUM 单位且与代码匹配，就存储源测量时的单位，并在显示或分析时进行转换。这样可以使每个存储的值都可追溯到其原始报告。

### 标准化可以完全自动化吗？
大部分可以。源中的代码、已知名称和格式正确的单位可以自动映射。含糊不清的名称和未知的本地代码需要每种来源一次人工决策，之后映射即可自动进行。

## 相关内容

- [FHIR 代码系统](https://developers.anpheros.com/zh/guides/fhir-code-systems)
- [如何将实验室结果导入 FHIR 记录](https://developers.anpheros.com/zh/guides/import-lab-results-fhir)
- [医疗数据溯源详解](https://developers.anpheros.com/zh/guides/medical-data-provenance)
- [医疗数据互操作性](https://developers.anpheros.com/zh/guides/interoperability)
- [医疗数据 API](https://developers.anpheros.com/zh/guides/medical-data-api)
