[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『パワークエリ:データ型とエディタ上の表示が相違する現象』(まっち)
以下のテーブルがあったとします。
連番 品目 日付
1 あ 1912/7/29
2 あ 1912/7/30
3 あ 1926/12/24
4 あ 1926/12/25
5 あ 1989/1/7
6 い 1989/1/8
7 い 2019/4/30
8 い 2019/5/1
(1)やりたいこと
品目毎に連番を振った列を追加したい
(2)やったこと
let
ソース = Excel.CurrentWorkbook(){[Name="テーブル3"]}[Content], グループ化 = Table.Group(ソース, {"品目"}, {{"カウント", each _, type table}}), 品目毎連番 = Table.AddColumn(グループ化, "カスタム", each Table.AddIndexColumn([カウント],"インデクス",1,1), type table [連番=Int64.Type, 品目=Text.Type, 日付=Date.Type]), 他の列削除 = Table.SelectColumns(品目毎連番,{"カスタム"}), #"展開された カスタム" = Table.ExpandTableColumn(他の列削除, "カスタム", {"連番", "品目", "日付", "インデクス"}, {"連番", "品目", "日付", "インデクス"}) in #"展開された カスタム"
(3)結果
連番 品目 日付 インデクス
1 あ 1
2 あ 2
3 あ 3
4 あ 4
5 あ 5
6 い 1
7 い 2
8 い 3
日付がブランクになってしまう。
以前「データ型が一致していないとブランクになる」と教わり、
「品目毎連番 =」のところで、日付=Date.Typeと指定しているのですが、
「#"展開された カスタム" =」のところで展開すると、
日付列のデータ型「日付」となっているのですが、エディタ上は
日付/時刻のようにyyyy/MM/dd h:mm:ssとdatetime型のように表示されて
いるのです。(タイトルのところはちゃんと日付型になっているのに・・・)
単なるバグであるならMS社にしかわからないのでしょうが、もし、ご存じの
方がいらっしゃいましたら、教えてください。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
日付列は最初から最後までずっと日付時刻型のままです。 最初に日付型にしましょう また、前の質問であったように、グループ化すると、任意型に変わってしまうので...
let ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content], 変更された型 = Table.TransformColumnTypes(ソース,{{"連番", Int64.Type},{"品目", type text},{"日付", type date}}), // 日付をDate型にする グループ化 = Table.Group(変更された型, {"品目"}, {{"カウント", each _, type table [連番=Int64.Type, 品目=Text.Type, 日付=Date.Type]}}), // ここで Tableの各列の型を指定 品目毎連番 = Table.AddColumn(グループ化, "カスタム", each Table.AddIndexColumn([カウント],"インデクス",1,1), type table [連番=Int64.Type, 品目=Text.Type, 日付=Date.Type]), 他の列削除 = Table.SelectColumns(品目毎連番,{"カスタム"}), #"展開された カスタム" = Table.ExpandTableColumn(他の列削除, "カスタム", {"連番", "品目", "日付"}, {"カスタム.連番", "カスタム.品目", "カスタム.日付"}) in #"展開された カスタム" (´・ω・`) 2022/07/19(火) 12:53
ちなみに、返信を踏まえ、以下で実行してみましたが、だめでした。
let
ソース = Excel.CurrentWorkbook(){[Name="テーブル3"]}[Content], 変更された型 = Table.TransformColumnTypes(ソース,{{"連番", Int64.Type},{"品目", type text},{"日付", type date}}), // 日付をDate型にする グループ化 = Table.Group(ソース, {"品目"}, {{"カウント", each _, type table [連番=Int64.Type, 品目=Text.Type, 日付=Date.Type]}}), 品目毎連番 = Table.AddColumn(グループ化, "カスタム", each Table.AddIndexColumn([カウント],"インデクス",1,1), type table [連番=Int64.Type, 品目=Text.Type, 日付=Date.Type]), 他の列削除 = Table.SelectColumns(品目毎連番,{"カスタム"}), #"展開された カスタム" = Table.ExpandTableColumn(他の列削除, "カスタム", {"連番", "品目", "日付", "インデクス"}, {"連番", "品目", "日付", "インデクス"}) in #"展開された カスタム" (まっち) 2022/07/19(火) 13:07
グループ化 = Table.Group(ソース, のソースを変更された型に直し損ねてました。
申し訳ございません。
(まっち) 2022/07/19(火) 13:09
日付列は最初から最後までずっと日付時刻型のままなので、最初に 型の変更しなければならないことはわかったのですが、
[連番=Int64.Type, 品目=Text.Type,は、最初にanyのままでも
グループ化の時にしていすれば、その型を維持してくれるのです。
日付だけは、違う動きしている感じでまだ気持ち悪いですが、
頑張って勉強していきます。
ありがとうございました。
(まっち) 2022/07/19(火) 13:16
変更された型で、日付以外は、任意の型にしていても グループ化のところで、型をしていすれば、 その型を維持してくれる。 日付だけは、最初に型をしていしないといけないのはなぜなのか。 わかったら、展開してみたいと思います。(実害ないので趣味のレベルですが)
let
ソース = Excel.CurrentWorkbook(){[Name="テーブル3"]}[Content], 変更された型 = Table.TransformColumnTypes(ソース,{{"日付", type date}}), // 日付をDate型にする グループ化 = Table.Group(変更された型, {"品目"}, {{"カウント", each _, type table [連番=Int64.Type, 品目=Text.Type, 日付=Date.Type]}}), 品目毎連番 = Table.AddColumn(グループ化, "カスタム", each Table.AddIndexColumn([カウント],"インデクス",1,1), type table [連番=Int64.Type, 品目=Text.Type, 日付=Date.Type]), 他の列削除 = Table.SelectColumns(品目毎連番,{"カスタム"}), #"展開された カスタム" = Table.ExpandTableColumn(他の列削除, "カスタム", {"連番", "品目", "日付", "インデクス"}, {"連番", "品目", "日付", "インデクス"}) in #"展開された カスタム" (まっち) 2022/07/19(火) 13:22
グループ化するときに、連番の列の型をテキスト型で指定する Table.Group(変更された型, {"品目"}, {{"カウント", each _, type table [連番=Text.Type, 品目=Text.Type, 日付= Date.Type] }}) と、やっぱりうまくいかないわけですから、 「型を指定すると、自動で型変換してくれる」という認識が間違っているのだと思います
なぜ「型の指定」=「自動型変換」と考えたのですか? (´・ω・`) 2022/07/19(火) 13:57
ソースを取り込んだ時「連番=any」「品目=any」「日付=any」になる
型の変更をせずに
グループ化のときに「連番=Text」「品目=Text」「日付=Date」に指定して展開すると
結果は、「連番=Text」「品目=Text」「日付=Datetime」になってしまいます。
最初に型の変更しなければだめですよとお教えいただいたので、
ソースを取り込んだ時「連番=any」「品目=any」「日付=any」になる
型の変更する「日付=Date」を実行
グループ化のときに「連番=Text」「品目=Text」「日付=Date」に指定して展開すると
結果は、「連番=Text」「品目=Text」「日付=Date」になるのです。
Int64.Type や Text.Typeの項目は、最初にTable.TransformColumnTypesでanyのままにしても
そのあとのグループ化の時の型指定は維持してくれるのに、Dateだけは、最初にDate型にしないで
グループ化でDate型と指定してもDatetimeになってしまうのはなぜなんだろうとがんばって考えて
いるのです。
頭の中では、自動で型変換してくれるというのではなく、
なぜ、型を指定したのに勝手にdatetimeに変換されちゃうのだろう?です。
たぶん、私のあたまの中のどこかの認識が違うのでしょう。う〜ん。
(まっち) 2022/07/19(火) 15:03
>Dateだけは、最初にDate型にしないでグループ化でDate型と指定してもDatetimeになってしまう 各列の左側のアイコンで、列の型が分かりますが、 Date型はカレンダーのアイコン 、DateTime型はカレンダー+時計のアイコンです。
let table = Table.FromRecords( { [Id = 1, Name = "あ",日付=#datetime(2022,7,20,0,0,0)], [Id = 2, Name = "い",日付=#datetime(2022,7,21,0,0,0)] }, type table [Id=Int64.Type, Name= Text.Type, 日付=Date.Type] ) in table
というクエリのがあったとして、 table [Id=Int64.Type, Name= Text.Type, 日付=Date.Type] というのは、テーブル各列の型を指定しているわけです。
列のアイコンを確認してください。 日付列のアイコンは、カレンダーになってて、日付型であることになってませんか? 一方で、画面上はデータは時間まで表示されててDateTime型になっているように見えます
実際には、Id列のデータは 1,2 という整数で、Name列のデータは"あ","い"という文字列です。 この2つは、テーブルの列の型と実際のデータの型が一致してますので、問題ありません
日付の列は、Date型の列にDateTime型を入れようしてますので、ミスマッチです。 実際のデータ型とテーブルの列の型が一致してないとうまくいかないのだと思います。
画面上(これはあくまでプレビューです)はDateTime型が入っているように見えますが、 シートに読み込むとうまくいってません
テーブルの列の型と実際のデータの型が一致するように、Table.TransformColumnTypesで型変換すればうまくいきます。 テーブルの列の型がDeta型だからといって、自動で型が一致するように型変換はしてくれないようです。
ということを申し上げています。
パワークエリは、結構型に厳格な印象です 文字列と数値の文字連結とかしっかりエラーだしてくれますし。
この件については、私からはこれ以上書くことはありません かなり私の推測というか私見が入ってます。 公式ドキュメントに何か書いてあればいいのですが。 (´・ω・`) 2022/07/19(火) 15:42
テーブルの列の型と実際のデータの型が一致するように、Table.TransformColumnTypesで型変換していくようにしてまいります。
ご丁寧にご説明いただき、感謝いたします。
本当にありがとうございます。
(まっち) 2022/07/19(火) 16:19
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.