列型の仕様
データ内の各列には必ず型が付与され、その列の性質を表現します。
型があることで、各列の状態を健全に保つことができます。
型の種類
データソース、分析プロジェクトにおける列の型を説明します。
数値型
数値のみで構成される列に付与可能な型であり、数値演算が可能になります。 数値型列には、下記のアイコンが付与されます。
小数の計算で生じる誤差
小数の計算では、結果の末尾にごくわずかな誤差が現れることがあります。
| 計算 | nehan での結果 |
|---|---|
0.1 + 0.2 | 0.30000000000000004 |
0.3 - 0.1 | 0.19999999999999998 |
1.1 * 3 | 3.3000000000000003 |
0.3 / 0.1 | 2.9999999999999996 |
なぜ起きるのか
数値は内部で 2 進数として保持されます。
2 進数で正確に表せるのは0.5・0.25・0.125のように2 で割り切れる小数だけで、0.1や0.2のような日常的な小数は正確に表せません。
そのため、計算のたびにごく小さな差が生まれます。
誤差が出ない場合もあります
正確に表せない値を使っても、必ず誤差が現れるわけではありません。
例えば0.1との足し算では、結果に誤差が現れるのは相手が0.2と0.7のときだけで、0.3や0.4との足し算は0.4・0.5とちょうどの値になります。
どの組み合わせで誤差が現れるかを事前に見分けることはできません。 小数を扱う際は、常に誤差が生じうるものとしてお考えください。
整数の場合
整数は 9,007,199,254,740,992(約 9007 兆) までは正確に扱えます。
これを超えると整数でも正確でなくなり、例えばこの値に 1 を足しても結果は変わりません。
対処方法
- 小数を比較する場合は、数値列の端数処理で丸めてから比較してください
- 小数どうしを「等しい」条件で比較すると、見た目が同じでも一致しない場合があります
- 桁数の多い ID や会員番号は、数値型ではなく文字列型のまま扱ってください
保持できる小数の有効数字は 17 桁までで、それを超える精度は失われます。
文字列型に変換したときの表記は文字列型に変換したときの表記を参照してください。
文字列型
どんな値の列にも付与可能な型であり、列内の値を文字として扱うことで、文字列の結合や置換が可能です。
最も汎用性が高い型であり、全ての列は文字列型に変換が可能です。
文字列型列には、下記のアイコンが付与されます。
日付型
日付のみで構成される列に付与可能な型であり、2022-01-01のように、
- 4 桁の年
- 2 桁の月
- 2 桁の日
をハイフンで繋いだ形式で表記されます。 なお、nehan で扱える日付の範囲は 1677-09-22 ~ 2262-04-11 です。 日付型列には、下記のアイコンが付与されます。
時間型
時間を表す列に付与可能な型であり、12:34:56のように、
- 2 桁の時
- 2 桁の分
- 2 桁の秒
をコロンで繋いだ形式で表記されます。 また秒に関しては、小数点以下の値を含めることができ、例えば12:34:56.789のような表記も可能であり、小数点以下の値は下 6 桁まで表示され、それ以下は切り捨て表示されます。 なお、nehan で扱える時間の範囲は 00:00:00.000000 ~ 23:59:59.999999 です。 時間型列には、下記のアイコンが付与されます。
小数秒の精度
時間型・日付時間型への変換では、小数秒は 1 桁から 9 桁まで受け付けます。
ただし保持されるのは 6 桁(マイクロ秒)までで、7 桁目以降は切り捨てられます。
12:34:56.1 → 12:34:56.10000012:34:56.1234 → 12:34:56.12340012:34:56.123456 → 12:34:56.12345612:34:56.123456789 → 12:34:56.123456 ← 下 3 桁は切り捨て10 桁以上の小数秒は変換できません。
日付時間型
日付と時間の両方を含む列に付与可能な型であり、2022-01-01 12:34:56のように、日付型と時間方をスペースで繋いだ形式で表記されます。
なお、nehan で扱える日付時間の範囲は 1677-09-21 00:12:43.145225 ~ 2262-04-11 23:47:16 です。
日付時間型列には、下記のアイコンが付与されます。
型変更で扱える文字列パターン
文字列型の列を日付型・日付時間型・時間型に変更する際、どのような文字列を変換できるかを示します。
この仕様は、データソースの列型変更と、分析プロジェクトの列の型変更に共通して適用されます。
形式を指定しない場合、nehan が値から形式を自動で判定します。
自動で判定できない形式でも、日付形式を指定することで変換できます。指定方法は日付フォーマットの仕様を参照してください。
日付型に変更する
形式を指定せずに変換できる
| 分類 | 例 |
|---|---|
| 区切りあり | 2024-01-15 2024/01/15 2024.01.15 |
| ゼロ埋めなし | 2024-1-5 2024/1/15 |
| 区切りなしの 8 桁 | 20240115 |
| 日-月-年 | 15-01-2024 15/01/2024 15.01.2024 |
| 月/日/年 | 01/15/2024 |
| 英語の月名 | Jan 15 2024 15-Jan-2024 January 15 2024 15 Jan 2024 Mon Jan 15 2024 |
| 日付時間(時刻は切り捨て) | 2024-01-15 10:30:00 2024-01-15T10:30:00 2024-01-15T10:30:00Z |
形式の指定が必要
| 例 | 指定する形式 |
|---|---|
2024-01 | %Y-%m |
2024/01 | %Y/%m |
202401 | %Y%m |
2024 | %Y |
2024年1月15日 2024年01月15日 | %Y年%m月%d日 |
24-01-15 | %y-%m-%d |
1/15/24 | %m/%d/%y |
変換できない
| 例 | 理由 |
|---|---|
2024-13-01 2024-02-30 | 存在しない日付 |
1705276800 | Unix 時間 |
45306 | 表計算ソフトのシリアル値 |
2024-01-15 | 全角数字 |
2024-01-15(月) | 曜日などの余分な文字を含む |
扱える日付の範囲を超えた値も変換できません。範囲は日付型を参照してください。
日付時間型に変更する
形式を指定せずに変換できる
| 分類 | 例 |
|---|---|
| 区切りあり | 2024-01-15 10:30:00 2024-01-15T10:30:00 2024/01/15 10:30:00 |
| ゼロ埋めなし | 2024/1/15 10:30 |
| 秒なし | 2024-01-15 10:30 |
| 小数秒あり | 2024-01-15 10:30:45.1 2024-01-15 10:30:45.123456 |
| タイムゾーンあり | 2024-01-15T10:30:00Z 2024-01-15T10:30:00+09:00 |
| 日付のみ(時刻は 0 時) | 2024-01-15 |
形式の指定が必要
| 例 | 指定する形式 |
|---|---|
20240115103045 | %Y%m%d%H%M%S |
20240115 103045 | %Y%m%d %H%M%S |
2024年1月15日 10時30分45秒 | %Y年%m月%d日 %H時%M分%S秒 |
変換できない
| 例 | 理由 |
|---|---|
10:30:00 | 時刻のみで日付の情報がない |
2024-01-15 25:00:00 | 24 時以上の時刻 |
1705276800 | Unix 時間 |
時間型に変更する
形式を指定せずに変換できる
| 分類 | 例 |
|---|---|
| 時分秒 | 12:34:56 00:00:00 23:59:59 |
| 秒なし | 12:34 0:00 |
| ゼロ埋めなし | 1:05:00 |
| 小数秒あり | 12:34:56.1 12:34:56.123456 |
| タイムゾーンあり | 12:34:56+09:00 |
| 日付時間(日付は切り捨て) | 2024-01-15 12:34:56 |
形式の指定が必要
| 例 | 指定する形式 |
|---|---|
12時34分56秒 | %H時%M分%S秒 |
123456 | %H%M%S |
01:34:56 PM | %I:%M:%S %p |
変換できない
| 例 | 理由 |
|---|---|
24:00:00 25:00:00 | 24 時以上の時刻 |
12:34:56.123456789012 | 小数秒が 10 桁以上 |
列の中で形式が混在する場合
1 つの列に複数の形式が混ざっていても、行ごとに判定して変換されます。
形式を揃えるための前処理は不要です。
変換できない値が 1 つでも混ざるとエラーになりますが、エラーを無視するを有効にすると、変換できなかった値だけが欠損値になり処理は完了します。
欠損値が混ざっていてもエラーにはなりません。
日付型に変更する場合
| 列の中身 | 結果 |
|---|---|
2024-01-15 と 2024/01/15 | どちらも 2024-01-15 |
2024-01-15 と 2024.01.15 | どちらも 2024-01-15 |
2024-01-15 と 20240115 | どちらも 2024-01-15 |
2024-01-15 と 2024-1-5 | 2024-01-15 と 2024-01-05 |
2024-01-15 と Jan 15 2024 | どちらも 2024-01-15 |
2024-01-15 と 15-01-2024 | どちらも 2024-01-15 |
2024-01-15 と 2024-01-15 10:30:00 | どちらも 2024-01-15(時刻は切り捨て) |
2024-01-15 と欠損値 | 2024-01-15 と欠損値(エラーにならない) |
2024-01-15 と 2024-01 | エラー(2024-01が変換できない) |
2024-01-15 と 2024 | エラー(2024が変換できない) |
日付時間型に変更する場合
| 列の中身 | 結果 |
|---|---|
2024-01-15 10:30:00 と 2024-01-15T10:30:00 | どちらも 2024-01-15 10:30:00 |
2024-01-15 10:30:00 と 2024/01/15 10:30 | どちらも 2024-01-15 10:30:00 |
2024-01-15 10:30:45.1 と 2024-01-15 10:30:45.123456 | 小数秒の桁が違っても変換できる |
2024-01-15T10:30:00Z と 2024-01-15 10:30:00 | どちらも 2024-01-15 10:30:00 |
2024-01-15 10:30:00 と 2024-01-15 | 10:30:00 と 00:00:00(時刻は 0 時になる) |
2024-01-15 10:30:00 と欠損値 | エラーにならない |
2024-01-15 10:30:00 と 10:30:00 | エラー(時刻のみは変換できない) |
2024-01-15 10:30:00 と 2024-01-15 25:00:00 | エラー(24 時以上は変換できない) |
時間型に変更する場合
| 列の中身 | 結果 |
|---|---|
12:34:56 と 12:34 | 12:34:56 と 12:34:00 |
12:34:56 と 12:34:56.123 | 小数秒の有無が違っても変換できる |
12:34:56 と 2024-01-15 12:34:56 | どちらも 12:34:56(日付は切り捨て) |
12:34:56 と 12:34:56+09:00 | 12:34:56 と 03:34:56(UTC に変換される) |
12:34:56 と欠損値 | エラーにならない |
12:34:56 と 25:00:00 | エラー(24 時以上は変換できない) |
12:34:56 と 12時34分56秒 | エラー(和文表記は形式の指定が必要) |
時系列型どうしの相互変換
すでに日付型・日付時間型・時間型が付与されている列を、別の時系列型に変更できるかを示します。
| 変換元\変換先 | 日付型 | 日付時間型 | 時間型 |
|---|---|---|---|
| 日付型 | - | できる(時刻は00:00:00) | できる(すべて00:00:00) |
| 日付時間型 | できる(時刻を切り捨て) | - | できる(日付を切り捨て) |
| 時間型 | できない | できない | - |
どの型の列も、文字列型には変換できます。
文字列型に変換したときの表記
どの型の列も文字列型に変換できますが、変換後の見た目が元の表示と変わる場合があります。
文字列型に変換したうえで文字列の結合や置換を行う場合は、以下に注意してください。
数値型から
数値型を文字列型に変換すると、値によっては指数表記(1e-05のような表記)になります。
指数表記になっても数値そのものは変わりません。表記だけが変わります。
| 元の値 | 変換後の文字列 | 説明 |
|---|---|---|
1 | 1 | 整数値は全桁で出力される |
100000000000000000000 | 100000000000000000000 | 大きな整数値も全桁で出力される |
0.1 | 0.1 | 小数はそのまま |
0.0001 | 0.0001 | そのまま |
0.00012345 | 0.00012345 | そのまま |
0.00001 | 1e-05 | 指数表記になる |
0.0000123 | 1.23e-05 | 指数表記になる |
1.71e+38 | 1.71e+38 | 指数表記になる |
日付型・日付時間型・時間型から
| 型 | 元の値 | 変換後の文字列 |
|---|---|---|
| 日付型 | 2024-01-15 | 2024-01-15 |
| 日付時間型 | 2024-01-15 10:30:45 | 2024-01-15 10:30:45 |
| 日付時間型 | 2024-01-15 10:30:45.123 | 2024-01-15 10:30:45.123 |
| 日付時間型 | 2024-01-15 00:00:00 | 2024-01-15 00:00:00 |
| 時間型 | 10:30:45 | 10:30:45 |
| 時間型 | 10:30:45.123 | 10:30:45.123 |
小数秒を持つ値は、小数秒を含んだ文字列になります。
日付時間型は時刻が 0 時でも00:00:00が付きます。
列型の自動付与
ユーザーが任意の型を付与せずとも、nehan では列の値に応じて自動で型が付与されます。
自動型付けはデータソースの読み込み時、および分析プロジェクト内でのデータ処理時に行われます。
ファイル系データソース読み込み時
CSV ファイルなどを読み込むと、列の値を見て型が決まります。
判定はファイルの先頭 1,000,000 行までの値をもとに行われます。
| 列の値 | 付与される型 | 補足 |
|---|---|---|
| すべての値が数値 | 数値型 | |
| 数値でない値が 1 つでもある | 文字列型 | |
2024-01-15 | 文字列型 | 日付型にするには列型変更が必要 |
10:30:00 | 文字列型 | 時間型にするには列型変更が必要 |
20240115 | 数値型 | 8 桁の数字は日付ではなく数値として扱われる |
true / false | 文字列型 | |
| すべて空 | 文字列型 |
日付として扱いたい列や、先頭の 0 を保ちたい列は、データソースの列型変更で型を固定してください。
どのような文字列がどの型に変換できるかは型変更で扱える文字列パターンを参照してください。
データソースを更新したとき
一度決まった列の型は、更新後も引き継がれます。 更新のたびに推定し直されるわけではありません。
| 更新前の型 | 更新後のファイルの中身 | 結果 |
|---|---|---|
| 数値型 | 数値でない値が混ざった | エラー(型が合わないため読み込めない) |
| 文字列型 | すべて数値になった | 文字列型のまま |
| 列型変更で指定 | 指定した型に変換できない値が混ざった | エラー |
更新で新しく増えた列には、読み込み時と同じ規則で型が自動付与されます。
列型変更で型を指定した場合
データソースの列型変更で型を指定した場合は、自動付与より指定した型が優先されます。
指定した型に変換できない値が含まれている場合はエラーになり、どの列のどの値が変換できなかったかがメッセージに表示されます。
分析プロジェクト内にて新規列発生時
データ処理機能で新しい列が作られるとき、その列の型は次の順で決まります。
- 型を指定できる機能では、指定した型になります
- 元の列を引き継ぐ場合は、元の列の型になります
- どちらでもない場合は、値の内容から自動で推定されます
3 の自動推定では、数値型か文字列型のどちらかだけが付与されます。
データソースの読み込み時と同じく、日付型・日付時間型・時間型が自動で付くことはありません。
値から推定される型
条件分岐などで、返す値を直接入力して新しい列を作る場合の例です。
| 入力した値 | 付与される型 | 補足 |
|---|---|---|
1 0 | 数値型 | |
100 -1 1.5 1e3 | 数値型 | |
2020-01-01 | 文字列型 | 日付型にはならない |
10:30:00 | 文字列型 | 時間型にはならない |
high low | 文字列型 | |
true false | 文字列型 | |
1とlowのように混在 | 文字列型 | 数値と文字列が混ざると文字列型になる |
| すべて空 | 文字列型 | 全欠損の列になる |
元の列や集計結果から決まる型
クロス集計(横持ち変換) のように、元のデータから新しい列が作られる場合は、集計結果の値によって型が決まります。
| 店舗 | 商品 | 売上 |
|---|---|---|
| 東京 | A | 100 |
| 東京 | B | 200 |
| 大阪 | A | 300 |
縦に店舗、横に商品、集計する値に売上(合計)を指定すると、次の結果になります。
| 店舗(文字列型) | A(数値型) | B(数値型) |
|---|---|---|
| 東京 | 100 | 200 |
| 大阪 | 300 |
- 縦に指定した列(店舗)は、元の列の型がそのまま引き継がれます
- 横に指定した列(商品)の値が、新しい列の名前になります
- 新しくできた列(A・B)の型は、集計した結果の値で決まります
集計方法によって結果の型が変わります。
| 集計する値の型 | 集計方法 | できる列の型 |
|---|---|---|
| 数値型 | 合計・平均・最大・件数 | 数値型 |
| 日付型 | 最大・最小 | 日付型 |
| 日付型 | 件数 | 数値型 |
なお、横に指定した列が日付型の場合、2024-01-15のように日付の値がそのまま列の名前になります。
全欠損と型
データソース、分析プロジェクトにおいて、列の値が全て欠損値の場合、つまり全欠損の場合の挙動を説明します。
新規で全欠損列が作成された場合
型を指定しない場合、全欠損の列は文字列型になります。
これはファイル系データソースの読み込み時と、分析プロジェクト内で新規列が作られた場合の両方に当てはまります。
全欠損の列は任意の型に変更可能で、指定した型が優先されます。
既存の列が全欠損になった場合
分析プロジェクト内で行ったデータ処理の結果、既存の列が全欠損になった場合、その列は親ノードの列型を継承します。
例えば、分析プロジェクト内のノードに下記のデータがあると仮定します。
| 名前 | 性別 | 身長(数値型) |
|---|---|---|
| 田中 | 男 | <NA> |
| 鈴木 | 女 | 160 |
| 佐藤 | 男 | <NA> |
このノードに対して条件で行をフィルタノードを接続し、性別列 = “男”の条件を適用します。
結果、下記のデータが得られます。
| 名前 | 性別 | 身長(数値型) |
|---|---|---|
| 田中 | 男 | <NA> |
| 佐藤 | 男 | <NA> |
身長列は処理の結果全欠損しましたが、親ノードの身長列の型が継承され、数値型となります。