在数据透视表中更改分组日期的日期格式

22

我正在使用 Excel 2010

假设您的原始数据中有一个合法的日期字段,其中包含诸如1/1/2015之类的日期。然后您创建了一个数据透视表,并将日期字段放在行标签中。

现在假设您想按月显示结果,因此您右键单击“分组字段”,并选择按月分组。

现在,您的数据以Mmm格式显示为月份。如何将其更改为Mmmm格式?或者如果您想将其显示为数字(即Jan显示为1),该怎么办?

对于具有时间戳的日期进行分组时,数据透视表将其显示为D-Mmm。如果我想要MM/DD/YYYY呢?

是的,我已经尝试通过右键单击 ->字段设置 ->number format来更改它。但没有起作用。


1
一个解决方法是,在您的原始数据中添加一个字段,该字段是您要分组的格式化版本。如果使用文本公式,则它将被视为文本,避免了在数据透视表中重新转换的问题(希望如此)。 - legendjr
1
嗨,LegendJr,构建一个解决方法并不太难,但我想知道透视表内是否有本地支持。 - ChrisG
嗨,pnuts,这次我会拒绝使用VBA。 - ChrisG
微软还没有关于这个功能的更新吗?Excel 2016中也没有吗?:( - tm-
你有没有弄清楚什么?对我来说,这很疯狂,而且不受更改字段设置的影响! - rryanp
1
不幸的是,@rryanp 没有可行的解决办法。可能的解决方案包括,在源数据集中创建一个按照你所需要的格式化的日期字段,或者使用 PowerPivot/Excel 数据模型关联单独的日期数据表。 - ChrisG
10个回答

15

我曾经也遇到过相同的问题。我所做的就是右键点击想要在数据透视表上更改视图的值,然后选择“取消分组”选项。这样可以恢复常规视图格式。希望这能帮助到您。


3
你好Baris,感谢你提交回复。然而,这并没有帮助我们达成目标,因为我们的目标是改变分组日期的格式。 - ChrisG
Baris,非常感谢您的回复。在尝试了各种格式化之后,直到我尝试“取消组合”才成功了 :-) - SQL-challenged

9
自Excel 2016起,无法更改Excel在数据透视表中自动格式化分组日期的方式。
解决方法是,在源数据文件中创建一个带有所需格式的新字段/列,并在数据透视表中使用它。

6
如果您选择了日期被拆分的列(在数据透视表中 - 年、季度等),并执行数据取消分组操作。这将使您的日期格式更正常。

4
请参考其他答案和评论。目标是更改日期分组的格式。除非有一种方法可以在重新分组日期后解决问题,否则涉及取消分组的解决方案并不是这个问题的解决方案。请不要改变原意,但需使翻译通俗易懂。 - Dan Henderson

0

似乎有一个新选项“组字段”(标记为“7”,原因不明)。单击此选项,您将获得月/日/小时等单选按钮选项。选择您的首选项,然后单击确定。 希望这对您也有用!


0

Baris Sari的回答部分正确。您确实需要取消日期分组,这样就可以设置任何日期格式。

选择数据透视表中的所有日期,然后右键单击并选择取消分组。 然后再次右键单击所选内容,点击“格式化单元格”。打开的窗口中的第一个选项卡与数字有关。

这在Excel 2016和2010中都有效。


1
这并没有回答问题,因为它特别询问了关于分组日期的问题。如果您再次进行分组,那么您所做的任何格式都将消失。 - Dan Henderson

0
在您的原始数据中,将日期所在的那一列格式更改为文本,在数据透视表中选择该列并将其更改为常规短日期格式即可。对我来说有效。

0

我刚刚重新格式化了数据透视表的日期时间字段(原始格式为dd/mm/yyyy hh:mm:ss),将其转换为文本格式(ddddd.ttttt),然后当我刷新透视表时,它会以我选择的日期时间格式出现。


-1
我通过操作Excel文档的内部OOXML(Office Open XML)来解决了这个问题。如果您不知道如何打开Excel文档(以查看其内部组成的xml文档),请参考以下链接之一:
  • "最佳方式" 使用Visual Studio扩展(OOXML Package Editor)直接打开/编辑Excel文件:http://www.ericwhite.com/blog/open-xml-installation-center/

  • 或者使用一个“更简单”的基于Chrome的扩展程序(将Excel文件拖放到其中):https://chrome.google.com/webstore/detail/ooxml-tools/bjmmjfdegplhkefakjkccocjanekbapn?hl=en(记得在保存更改后下载新文件)

  • 或者“不建议”的方式:

    1.) 将文件名从“MyExcelFile.xlsx”更改为“MyExcelFile.zip”
    2.) 解压缩文件
    3.) 更改格式(如下所述)
    4.) 将所有内容重新压缩并将扩展名更改为.xlsx
    5.) 警告,此方法经常会损坏我的文件,但并非总是如此,因此我使用Visual Studio中的OOXML Package editor。

无论您使用的方法是什么,现在导航到您数据透视表的“PivotCache”。在我的“解压缩的Excel文件”中,文件路径为:Root > xl > pivotCache > pivotCacheDefinition1.xml

我的副本有大约800行XML,我想象它甚至可能更多,但只关注您要重新格式化的部分。(如果使用Visual Studio,请确保您对XML进行了美化,以便它不是一条长的压缩行Ctrl+K,Ctrl+D)

搜索属性:groupBy="months"

我的示例找到

    <cacheField name="Months" numFmtId="0" databaseField="0">
      <fieldGroup base="2">
        <rangePr groupBy="months" startDate="2019-01-02T00:00:00" endDate="2019-12-27T00:00:00"/>
        <groupItems count="14">
          <s v="&lt;1/2/2019"/>
          <s v="Jan"/>
          <s v="Feb"/>
          <s v="Mar"/>
          <s v="Apr"/>
          <s v="May"/>
          <s v="Jun"/>
          <s v="Jul"/>
          <s v="Aug"/>
          <s v="Sep"/>
          <s v="Oct"/>
          <s v="Nov"/>
          <s v="Dec"/>
          <s v="&gt;12/27/2019"/>
        </groupItems>
      </fieldGroup>
    </cacheField>
  </cacheFields>

...而你所要做的就是将“Jan”替换为“1”,或者你想要的每个月的字符串表示!

更进一步,但仍然回答了如何格式化分组列的问题,是将groupBy="days"进行格式化,结果如下:

    <fieldGroup par="5" base="2">
    <rangePr groupBy="days" startDate="2019-01-02T00:00:00" endDate="2019-12-27T00:00:00"/>
    <groupItems count="368">
    <s v="(blank)"/>
    <s v="1-Jan"/>
    <s v="2-Jan"/>
    <s v="3-Jan"/>...

列表还有很多,确切地说是368个元素。365天,加上第一个和最后一个元素,其中包括2月29日。如果您正在尝试格式化按天分组的行,则需要更改这些元素。例如:
    <s v="1-Jan"/>

你可以将它们更改为中文,例如(或任何你喜欢的语言,只需进行366个元素替换)(再次,不要改变第一个和最后一个元素)。
因此,“1-Jan”“2-Jan” 可以变成:
<s v="11日"/>
<s v="12日"/>...

你可以像之前处理月份那样处理这些。 然而,手动处理天数会更加繁琐,因为你需要为每一天创建一个元素,所以我编写了一个 C# 函数,你可以修改它以快速将元素输出到文件(以便复制并粘贴到你的 .xml 文件中)。

        public void GenerateExcelGroupedDateFormatPivotTableElements()
        {
            int year = 2019;
            var sb = new StringBuilder();
            for (int i = 1; i <= 12; i++)
            {
                var daysInMonth = DateTime.DaysInMonth(year, i);
                for (int j = 1; j <= daysInMonth; j++)
                {
                    //Modify template below as you wish, (uses String Interpolation $) and (Verbatim @ symbol)
                    
                    //Full Month Name: ie January-day
                    string monthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(i);
                    sb.AppendLine($@"<s v=""{monthName}-{j}""/>");

                    //or Chinese sample
                    //sb.AppendLine($@"<s v=""{i}月{j}日""/>");
                }
            }
            File.WriteAllText("_ExcelPivotTableGroupedDateHelper.txt",sb.ToString());
        }

重要提示:如果您使用此函数来输出您的日期,请手动添加2月29日,如果您要覆盖的原始设置中有2月29日(就像我的一样)。

免责声明:我不是Excel专家,可能在Excel表格的OOXML中有更好的方法来完成这个任务。这只是我今天发现的东西,我想分享一下我找到的答案,因为我自己找不到发布的答案。

欢迎提供此操作的后续建议和注意事项。

祝编码愉快!


-2

我尝试了两件事情:

  1. 我只是像往常一样更改单元格格式。

    格式化单元格

  2. 在分组时选择多个项目(在Windows上使用Ctrl+单击或在Mac上使用Command+单击)source

    分组框图像展示了两个选定的组:“自动”组和“按”组,其中包括起始和截止日期以及秒、分钟、小时等时间分割项...

附:我指定如何选择多个项目,因为这不太直观。


我已经尝试过这些(如我原帖中所述),但它们失败了。 - ChrisG

-3

我选择了其中一个列标题并单击了取消分组。

我的问题是数据透视表具有“mmm”标题,而我想要与我的原始数据对应的“m/d/yyyy”格式。


这与Baris Sari已经发布的答案相同,也没有帮助,因为目标是更改分组日期的格式。 - Dan Henderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接