Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
6 years ago
Solved

Formato de fecha

Hola

Tengo un conjunto de datos que se actualiza todos los días y columnas con fechas en ellos, sin embargo, el formato de estas fechas cambia de vez en cuando. Por ejemplo, en algún momento toda la columna puede estar en el formato "MM/DD/AAAA", mientras que a veces el formato puede ser "DD/MM/AAAA". Nunca sé cuándo va a cambiar el formato, así que no puedo simplemente "Cambiar tipo" o "Cambiar tipo usando configuración regional". ¿Hay algún tipo de captura de errores que puedo hacer para cambiar el tipo usando la configuración regional si el tipo de cambio no funciona? Necesito 3 columnas para ser convertidas juntas.

¡Gracias!

  • edhans's avatar
    edhans
    6 years ago

    No de la parte superior de mi cabeza. Si puede encontrar algún tipo de lógica de negocios, puedo ayudar con el lado de Power Query, pero no puedo pensar en una manera para que PQ solo sepa cuándo 4/1/2020 es el 4 de enero o el 1 de abril.

5 Replies

  • @studentt1205 , Puede convertir una fecha DD/MM/AAAA en MM/DD/AAAA

    date(year(DD__MM__YY[Version_Id],4)), month(mid(DD__MM__YY[Version_Id],4,2)) ,day(left(DD__MM__YY[Version_Id],2)))

    Pero, ¿cómo identificaría qué formato es?

    O tal vez todas las fechas están en formato DD/MM/AAAA es sólo por días <-12 , parece que es MM/DD/AAAA

  • edhans's avatar
    edhans
    Icon for Community Champion rankCommunity Champion

    Pruebe esto en Power Query @studentt1205

    Esto convertirá todo el texto a fechas (formatear las fechas como texto primero, o simplemente eliminar cualquier tipo de cambio anterior para esa columna como PQ asumirá texto para archivos planos) y luego contar los errores. Si hay errores, se convertirá mediante una localización.

    La forma en que funciona es que cuenta el número de errores en el paso anterior que tienen una conversión genérica Date.FromText([Date]). Si no hay errores, entonces lo deja en eso.

    Si hay errores, cambia a una conversión de localización, Date.FromText([Date], "en-BS") que es inglés/Bahamas. Tendrás que elegir tu propia localización. La forma más fácil de hacerlo es hacerlo manualmente en una columna y luego ir a robar el código de localización nn-XX que genera PQ.

    Hay un problema con este método. Si sus fechas son sólo unas pocas, es posible equivocarse por ejemplo, un montón de filas como 5/1/2020, 4/1/2020, 3/1/2020, etc. no generarán errores. En formato estadounidense, es sólo el 1 de mayo, el 1 de abril y el 1 de marzo, pero en Europa, es decir, el 5 de enero, el 4, 3 de enero.

    Pero si ese es el caso, entonces no lo sabrá. Sin embargo, si más adelante importa más datos y obtiene 18/1/2020, cambiará el ENTIRE COLUMN en esa actualización al formato localizado.

    Esto es lo que parece (utilicé otro conjunto de datos para jugar aquí)

    2020-05-05 07_58_32-20200502 - Left Anti Join in Power Query - Power Query Editor.png

    Coloque este código en una consulta en blanco:

    1) En Power Query, seleccione Nuevo origen y, a continuación, Consulta en blanco
    2) En la cinta inicio, seleccione el botón "Editor avanzado"
    3) Retire todo lo que ve, luego pegue el código M que le he dado en ese cuadro.
    4) Pulse Hecho

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("Zc87DsIwDIDhu2RGws84GQviFYSgpQIE6v2vgU2XSizxP3xyks8nga4B1wQEaZX6FyIOHqeh5Np7VNXioxhhmlbO84I/OkNoHpsnYw7O5AdK0RnbAo8HqbDzaG8l3nhkVj/NcvlppIVuo0E9xeqGInsPQuAYReaXIC/49Vznh3f7ynbwUGOJO7LBP78fVeXocWmi9gpeamw3Ifvnt21mfsYf3ob4CA5iMQg5TdMX", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Date = _t, #"Dimension 1" = _t, #"Dimension 2" = _t, #"Measure 1" = _t, #"Measure 2" = _t]),
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type text}, {"Dimension 1", type text}, {"Dimension 2", type text}, {"Measure 1", Int64.Type}, {"Measure 2", Int64.Type}}),
        #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", 
            each 
                if Table.RowCount(
                    Table.SelectRowsWithErrors(
                        Table.AddColumn(#"Changed Type", "Custom", each Date.FromText([Date]))
                        )
                    ) > 0 
                then Date.FromText([Date], "en-BS") 
                else Date.FromText([Date])
            )
    in
        #"Added Custom"

    • Anonymous's avatar
      Anonymous
      Not applicable

      Hola @edhans,

      Gracias, esto es muy útil. Sin embargo, el problema es con fechas como 4/1/2020 como usted mencionó. ¿Hay algo que se te ocurra para resolver eso?

      • edhans's avatar
        edhans
        Icon for Community Champion rankCommunity Champion

        No de la parte superior de mi cabeza. Si puede encontrar algún tipo de lógica de negocios, puedo ayudar con el lado de Power Query, pero no puedo pensar en una manera para que PQ solo sepa cuándo 4/1/2020 es el 4 de enero o el 1 de abril.