您可以使用数据表或数据工程为您的数据集添加和计算新字段。 您可利用已计算字段通过从数据集中选择字段并应用运算符和函数来创建值,例如增长率、损失率以及随时间的变化。
还可以使用查找答案中的计算百分比变化、计算比例和计算 Z 得分以计算字段。
提示:
可以使用数据表将归一化数据添加到地图、图表和表的数据集。 在计算数据并将其添加到您的数据集后,需要更改字段类型以采用比率/比例字段 形式表示该数据。 有关数据归一化的详细信息,请参阅分区统计图。
计算数据表中的字段
数据表中的已计算字段仅会出现在工作簿中,而不会添加到原始数据集中。 如果要保留工作簿之外的已计算字段,则可以通过共享数据集或使用数据工程来创建新的要素图层。
注:
数据表格可以提供数据的典型视图,显示限制为 2,000 行。 以升序或降序对表格进行排序可以查看顶部 2,000 行以及底部 2,000 行。 所有计算均会在完整数据集上执行。
请完成以下步骤以计算数据表中的字段:
- 如有必要,可打开工作簿并添加数据。
- 在数据窗格中,单击要添加计算字段的数据集旁的数据集选项按钮 。
- 单击查看数据表。
- 单击 + 字段。
名为新字段的列即会附加到表格中。
注:
可以重新调整列的尺寸并对其进行重新排序,但是不会保存这些更改。
- 单击新列的标题并提供一个更具描述性的名称。
- 单击 fx 或输入计算函数,以显示包含函数、字段名称和运算符的菜单,从而构建自己的公式。
等效的键盘命令也可用于替换 fx 菜单中的任何按钮。
- 按要求使用函数、字段和运算符完成计算。
- 单击运行。
如果运行按钮未启用,则计算语法中存在错误。
新的已计算字段将显示在数据集的末尾处。 通过选择已计算字段并单击删除已计算字段按钮 可将其移除。
使用数据工程来计算列
注:
Insights desktop 中提供了数据工程。 所有 Insights in ArcGIS Online 和 Insights in ArcGIS Enterprise 用户都可以访问 Insights desktop。 有关详细信息,请参阅 ArcGIS Insights 概述。
数据工程现在可以预览。
可将计算列工具添加到数据模型,并将其用于将列添加到输出数据集。 数据工作簿中的已计算列将永久添加到输出数据集中,而非仅存在于工作簿中。
请完成以下步骤以使用数据工程来计算列:
- 如有必要,可在 Insights desktop 中打开数据工作簿并添加数据。
- 在侧面工具栏上,单击计算列按钮 。
- 对于新建列名参数,请键入新列的名称。
注:
Insights 中支持的数据库仅支持列名的字母、数字和下划线。 列名中不受支持的字符在保存到数据库时会转换为下划线(例如,population/sq mile 将转换为 population_sq_mile)。 为获得最佳结果,请应用仅使用受支持字符的列名称,然后在必要时使用其他字符更新列别名。
- 在列表达式框中,根据需要使用函数、列名称和运算符来完成计算。
等效的键盘命令也可用于替换任何按钮。
注:
如果数据工作簿具有多个数据集,则输入选项基于活动表。
- 单击运行。
如果运行按钮未启用,则计算语法中存在错误。
新的已计算列将被添加到表中,且计算列工具将被添加到数据模型中。
运算符
计算字段可能需要数学和逻辑运算符。 以下运算符可用于计算字段:
运算符 | 使用 |
---|---|
+ | 加。 |
- | 减。 |
× | 乘。 等效的键盘命令是 *。 |
÷ | 除。 等效的键盘命令是 /。 |
xy | 幂函数。 等效的键盘命令是 ^。 |
< | 小于。 |
> | 大于。 |
= | 等于。 |
<= | 小于或等于。 |
>= | 大于或等于。 |
<> | 不等于。 |
, | 逗号,用作函数中语法组件之间的分隔符。 |
( | 左括号。 |
) | 右括号。 |
AND | 逻辑运算符,必须满足所有条件。 |
OR | 逻辑运算符,必须满足其中一个条件。 |
IS NULL | 一个二进制运算符,用于测试字段中的值是否为空。 当测试值不为空时,输出值为 0;当测试值为空时,输出值为 1。 |
IS NOT NULL | 一个二进制运算符,用于测试字段中的值是否不为空。 当测试值为空时,输出值为 0;当测试值不为空时,输出值为 1。 |
注:
数学运算符(例如 +、-、> 和 =)与数字和比率/比例字段兼容。 函数(例如 CONCATENATE() 和 DATEDIF())可以分别用于代替字符串字段和日期/时间字段的某些数学运算符。
IS NULL 和 IS NOT NULL 运算符与除位置之外的所有字段类型(字符串、数字、比率/比例和日期/时间)兼容。 一些具有空值的字符串字段可以配置为空字符串。 在这些情况下,IS NULL 和 IS NOT NULL 将不会返回预期的结果。 相反,应使用 field="" 和 field<>"" 表达式分别代替 field IS NULL 和 field IS NOT NULL。
AND 和 OR 运算符可用于连接具有与其对应逻辑函数不同的语法的条件。 以下示例显示了使用函数和运算符的等效计算:
注:
在计算字段时,必须在 IF() 函数内使用 AND 和 OR。
函数 | 运算符 |
---|---|
IF(AND(MeanAge>=18, MeanAge<=33),"Millennial","Other") | IF(MeanAge>=18 AND MeanAge<=33,"Millennial","Other") |
IF(OR(Crime="Theft", Crime="Theft from vehicle", Crime="Shoplifting"), "Larceny", "Other") | IF(Crime="Theft" OR Crime="Theft from vehicle" OR Crime="Shoplifting", "Larceny", "Other") |
函数
可以使用数据表中的 fx 按钮或输入计算函数字段来访问函数。 函数分为四种类型:字符串、数值、日期和逻辑。
在计算中添加函数时,弹出窗口将显示函数语法。 您可以使用关闭按钮 移除弹出窗口,或通过单击输入计算函数字段中的函数来重新显示弹出窗口。
字符串函数
大多数字符串函数使用字符串输入生成字符串输出。 但是以下两个函数例外:VALUE() 函数和 FIND() 函数,这两个函数均使用字符串输入生成数值输出。
字符串函数中的输入文本可以为文字(用引号括起的文本)或类别字段值。 下表使用类别字段作为示例,并且使用可在这些字段中找到的示例值。 字段值中使用引号演示了字段具有分类数据。
语法 | 描述 | 示例 |
---|---|---|
CONCATENATE(text1, [text2], ... ) | 连接两个或多个字符串值。 | 加利福尼亚州学校的数据集包含街道地址字段、城市字段和邮政编码字段。 可以使用 CONCATENATE() 函数创建邮寄地址的单个字段:
|
FIND(find_text, within_text, [start_num]) | 提供字符串或文本字段内指定文本(一个或多个字符)的位置。 与诸如 MID()、LEFT() 或 RIGHT() 等其他函数结合使用时,FIND() 函数可能最有用。 | 数据集包含带街道地址的字段(包括数值和街道名称)。 要按街道对数据进行分类,可使用 MID() 函数从剩余地址中移除街道名称。 但是,每个数值的长度不同,因此无法对各行执行 start_num。 可使用 FIND() 函数找到 start_num。
|
LEFT(text, [num_chars]) | 返回文本字段的一部分。
| 交通事故数据集包括具有事故日期的类别字段,其中包括星期、日期和年份。 要按星期来研究事故,可使用 LEFT() 函数计算新字段以显示字段的前三个字符(从星期开始):
|
LOWER(text) | 将返回所有数据均转换为小写形式的字符表达式。 | 公共事业部门正在编写需要更换的街道符号列表。 向列表添加新条目后,Status 字段的格式变得不标准,因此无法使用唯一值来显示这些符号。 可使用 LOWER() 函数对 Status 字段进行标准化,以便全部显示小写字母:
|
MID(text, start_num, [num_chars]) | 返回文本字段的一部分。
| 加利福尼亚州学校的数据集包含街道地址字段、城市字段和邮政编码字段。 可以使用 MID() 函数从街道地址中分离街道名称:
|
RIGHT(text, [num_chars]) | 返回文本字段的一部分。
| 国家公园数据集包括具有公园名称和两位州代码的字段。 要按州对公园进行符号化,可使用 RIGHT() 函数来添加和计算新字段:
|
SUBSTITUTE(source_text, old_text, new_text) | 用指定的新文本替换字符串中的旧文本。
| 坑洼位置的数据集包含具有街道名称的字段。 当 Main Street 更名为 5th Street 时,需要更新数据集。 可使用 SUBSTITUTE() 函数更新 street_name 字段:
注:SUBSTITUTE() 函数将以 new_text 替换所有出现的 old_text。 例如,在函数 SUBSTITUTE("aba", "a", "c") 中,结果文本为“cbc”。 |
TRIM(text) | 将返回移除末尾多余空格的字符串。 | 要素服务包含在值的开头和结尾处存在多余空格的文本字符串。 可使用 TRIM() 函数移除多余的空格:
|
UPPER(text) | 将返回所有数据均转换为大写形式的字符表达式。 | NGO 总部位置的数据集包含组织全名及其缩写(如果适用)的字段。 可使用 UPPER() 函数对缩写进行标准化,以便全部显示大写字母:
|
VALUE(text, [format]) | 将文本转换为数值。
注:如果未提供 format,则 VALUE() 函数中的嵌套函数可能会输出意外的结果。 因此,建议在使用 VALUE() 函数时指定 format。 VALUE() 函数目前不支持将文本转换为负数。 | 零售店数据集具有含收入金额的类别字段。 可使用 VALUE() 函数将 Revenue 字段转换为数值。
|
数值函数
数值函数使用数值输入生成数值输出。 数值函数通常与其他函数结合使用,或者作为一种转换数据的方法。
输入数值可以为文字数值或数值字段。 为了更好地显示各个函数的用法,以下某些示例使用数值作为输入,而非字段。
语法 | 描述 | 示例 |
---|---|---|
ABS(number) | 返回绝对值。 |
|
AVG(number) | 返回平均值。 |
|
CEILING(number) | 将数字向上舍入为最近的 1 的倍数。 |
|
COS(number) | 指定角的三角余弦值,以弧度为单位。 可使用以下公式将度转换为弧度:
|
|
FLOOR(number) | 将数字向下舍入为最近的 1 的倍数。 |
|
LN(number) | 指定浮点表达式的自然对数。 自然对数使用常量 e 作为底数值(近似于 2.72) |
|
LOG(number) | 以指定数为底的数值的对数。 默认底数为 10。 |
|
MAX(number) 或 MAX(date) | 返回最大值。 |
|
MIN(number) 或 MIN(date) | 返回最小值。 |
|
PERCENTTOTAL(number) | 可以使用字段总计来计算每个字段值的百分比。 |
|
POWER(number, power) | 表达式的指定幂值。 |
|
ROUND(number, num_digits) | 将数值四舍五入到指定位数。
|
|
SIN(number) | 指定角的三角正弦值,以弧度为单位。 可使用以下公式将度转换为弧度:
|
|
STDEV(number) | 数值字段的标准差。 |
|
SUM(number) | 返回总值。 |
|
TAN(number) | 返回输入表达式的正切值。 可使用以下公式将度转换为弧度:
|
|
日期函数
日期函数可以使用日期字段、文本或没有任何输入,具体取决于使用的函数。 DATEVALUE() 函数可用于替换 DATEDIF() 或 TIMEDIF() 函数中的日期字段。
注:
在 DATEDIF() 和 DATEADD() 中使用的日期/时间字段必须采用包含日期的格式(换言之,采用日期和时间格式或者仅日期格式)。 将不接受仅时间的日期/时间字段。
在 TIMEDIF() 中使用的日期/时间字段必须采用包含时间的格式(换言之,采用日期和时间格式或者仅时间格式)。 不接受仅日期的日期/时间字段。
支持使用以下日期分隔符:点 (.)、虚线 (-) 和斜线 (/)。
语法 | 描述 | 示例 |
---|---|---|
DATE(year, month, day, [hour, minute, second], [AM/PM]) | 使用三个或更多单独的字段或值创建日期/时间字段。 接受以下规范:
注:所有输入字段均可以是数值或字符串,AM/PM 参数除外。 数值必须为整数值。 两位数年份必须为字符串。 如果您将 DATE() 函数与数据库数据集配合使用,并指定了任何时间参数(hour、minute 或 second),则必须输入所有时间参数的输入值。 | 餐厅数据集所包含的字符串字段中带有最近卫生检查的日期和时间。 可以使用 DATE() 函数创建检查的日期字段:
注:此示例中结果日期的格式将采用 24 小时制。 要使用 12 小时制,您必须指定 AM 或 PM。 相同的示例函数可以写成 DATE(2016, Month, Day, Hour, Min, 00, "AM")。 |
TIME(hour, minute, second) | 使用三个单独的字段或值创建日期/时间字段。 接受以下规范:
注:所有输入字段均可以是数值或字符串,AM/PM 参数除外。 数值必须为整数值。 | 医院记录的数据集包含病人的到达时间。 可以使用 TIME() 函数为记录创建时间字段:
注:此示例中结果时间的格式将采用 24 小时制。 要使用 12 小时制,您必须指定 AM 或 PM。 相同的示例函数可以写成 TIME(Hour, Min, 00, "AM")。 |
DATEADD(date, integer, [unit]) | 向输入字段中的日期添加指定的时间量。
如果未提供任何单位,则将使用 "D"。 向日期/时间字段添加月份时,输出将为相应月份的同一天,不考虑该月份中的天数。 如果该月份的相应日期在新月份中无效,则将使用该月份的最后一天。 例如,如果计算向输入字段添加三个月,并且原始日期之一为 2021 年 11 月 30 日,则输出值 2022 年 2 月 30 日无效。 由于 2022 年不是闰年,因此结果将记录为 2022 年 2 月 28 日。 | 公共卫生部门负责保存卫生区内患者的疫苗记录。 某种特定疫苗具有两针剂,这两针剂必须至少间隔 60 天,并且不超过 180 天。 DATEADD() 可用于创建字段,其中包含患者有资格接种第二剂的首个日期和最后一剂的截止日期。 有资格接种日期:
最终日期:
|
TIMEADD(time, integer, unit) | 向输入字段中的时间添加指定的时间量。
| 将以协调世界时间 (UTC) 记录数据集的日期和时间,需要将其转换为中部标准时间 (CST)。 可以使用 TIMEADD() 函数创建带有 CST 时间的日期/时间字段:
|
DATEDIF(start_date, end_date, [unit]) | 计算两个日期之间经过的时间。 start_date 必须早于 end_date,否则输出将为负值。
如果未提供任何单位,则将使用 "D"。 针对每个单位的结果执行四舍五入,如下所示:
| 餐厅数据集包含其最近卫生检查的日期。 可以使用 DATEDIF() 函数计算两次卫生检查之间经过的天数: 示例 1:
示例 2:
示例 3:
|
TIMEDIF(start_time, end_time, [unit]) | 计算两个日期/时间值之间经过的时间。 start_time 必须早于 end_time,否则输出将为负值。
如果未提供任何单位,则将使用 "ss"。 针对每个单位的结果执行四舍五入,如下所示:
| 医院收集记录的数据集中包括外科手术的开始和结束时间。 可以使用 TIMEDIF() 函数计算每个病人手术所消耗的时间:
|
DATEVALUE(date_text, [format]) | 将文本转换为日期。
注:如果未提供 format,则 DATEVALUE() 函数中的嵌套函数可能会输出意外的结果。 因此,建议在 DATEVALUE() 内嵌套函数时指定 format。 如果未提供 format,则未使用分隔符指定的日期(例如 "10312016")将视为毫秒。 因此,如果输入日期时未使用分隔符,建议指定一种格式。 如果指定日期时使用了分隔符,但是没有 format,则将猜测一种格式。 如果无法猜测格式,则将应用默认 "MM-DD-YY"。 DATEVALUE() 函数只能读取用引号括起的文本或字符串字段。 日期/时间字段无法用作 DATEVALUE() 函数的输入。 | 餐厅数据集包含其最近卫生检查的日期。 可使用 DATEVALUE() 函数指定自上次检查后经过的天数,从而指定当前日期:
可以通过多种方法对日期和时间进行格式化。 以下示例是一些将文本转换为日期格式的方法:
|
NOW() | 以日期/时间格式返回当前日期和时间。 将根据协调世界时间 (UTC) 记录时间。 | 餐厅数据集包含其最近卫生检查的日期。 可使用 NOW() 函数指定自上次检查后经过的天数,从而指定当前日期:
|
逻辑函数
逻辑函数使用字符串或数值输入生成字符串或数值输出。 输入内容可以为文字(用引号括起的文本或常数)或字段值。 下表使用字段和文本值的组合作为示例,并且使用可在给定字段中找到的示例值。
语法 | 描述 | 示例 |
---|---|---|
AND(condition,condition, ...) | 测试两个或多个条件,如果满足所有条件,则返回 TRUE。 AND() 应该在 IF() 函数的 condition 参数内使用。
| 数据集包含生活在每个区块组中的人的平均年龄。 市场研究人员希望了解哪些区块组主要包含千禧一代。 平均年龄在千禧一代年龄范围内的区块组可以通过 IF() 和 AND() 函数组合进行查找:
|
IF(condition, TRUE_expression, [FALSE_expression]) | 测试某一条件,并根据结果返回 TRUE 或 FALSE 值。
TRUE_expression 和 FALSE_expression 可以是任何有效的表达式,其中包括嵌套 IF() 函数。 TRUE_expression 和 FALSE_expression 的数据类型应该相同(例如,两者都是字符串或两者都是数值)。 | 数据集包含涵盖商店收入和费用的字段,可用于查找商店的状态(是否已发布净利润或净亏损)。 可使用 IF() 函数查找各个商店的状态:
|
ISNULL(field)* | 测试字段中的值是否为空。 当测试值不为空时,输出值为 0;当测试值为空时,输出值为 1。
ISNULL() 可单独使用或用于 IF() 函数的 condition 参数。 | 数据集包含涉及骑行者的交通事故的位置,以及发生事故的街道上的自行车道类型。 对于在没有自行车道的街道上发生的事故,RouteType 字段留空。 数据集可更新为使用 IF() 和 ISNULL() 函数组合填入空值。
|
ISNOTNULL(field)* | 测试字段中的值是否非空。 当测试值为空时,输出值为 0;当测试值不为空时,输出值为 1。
ISNOTNULL() 可单独使用或用于 IF() 函数的 condition 参数。 | 数据集包含涉及骑行者的交通事故的位置,以及发生事故的街道上的自行车道类型。 对于在没有自行车道的街道上发生的事故,RouteType 字段留空。 数据集可更新为使用 IF() 和 ISNOTNULL() 函数组合填入空值。
|
OR(condition,condition, ...) | 测试两个或多个条件,如果至少满足一个条件,则返回 TRUE。 OR() 应该在 IF() 函数的 condition 参数内使用。
| 一个数据集可包含整个城市犯罪发生的位置。 犯罪分析师想要通过与其他类似罪行进行比较来分析盗窃罪的模式。 为了将盗窃罪与其他罪行进行比较,分析师必须首先确定每种罪行是否应视为盗窃罪。 犯罪类型可以使用 IF() 和 OR() 函数的组合进行确定:
|
*没有数据的某些字段可以配置为空,而非 null。 在这些情况下,ISNULL() 和 ISNOTNULL() 将不会返回预期的结果。 相反,应使用 field="" 和 field<>"" 表达式分别代替 ISNULL(field) 和 ISNOTNULL(field)。