[[20220719113839]] 『パワークエリ:データ型とエディタ上の表示が相違』(まっち) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『パワークエリ:データ型とエディタ上の表示が相違する現象』(まっち)

以下のテーブルがあったとします。
連番 品目 日付
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

ご返信ありがとうございます。
いただいたコードでやってみましたが、やはり日付はdatetime型になってしまし、
ワークシートに戻すと日付がブランクになってしまいました。
他の要因かもしれませんので、引き続き頑張ってみます。

ちなみに、返信を踏まえ、以下で実行してみましたが、だめでした。

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.