¿El mejor formato de marca de tiempo para CSV / Excel?

110

Estoy escribiendo un archivo CSV. Necesito escribir marcas de tiempo que sean precisas al menos al segundo, y preferiblemente al milisegundo. ¿Cuál es el mejor formato para las marcas de tiempo en un archivo CSV de modo que Excel pueda analizarlas con precisión y sin ambigüedades con una mínima intervención del usuario?


fuente
¿Qué idioma estás usando para crear la salida?
Peter Perháč

Respuestas:

104

Para una segunda precisión, aaaa-MM-dd HH: mm: ss debería funcionar.

Creo que Excel no es muy bueno con fracciones de segundo (las pierde al interactuar con el objeto COM IIRC).

Joe
fuente
Sí, estoy de acuerdo contigo y Fredrik. Si pudieras desenterrar esas referencias, sin duda te lo agradecería. ¡Gracias!
18
Para cualquiera que use Ruby strftime, la cadena de argumento equivalente es"%Y-%m-%d %H:%M:%S"
Greg Matthew Crossley
2
@nickf: .CSVes solo un archivo de texto. Puede mostrar la zona horaria o cualquier otra cosa que escriba en el archivo como texto sin formato separado por comas; lo que importa es qué aplicación lo leerá y cómo esa aplicación espera el texto. Aquí está la documentación para el estándar CSV de la Biblioteca del Congreso. No existe una forma prescrita de almacenar fechas específicamente. También RFC-4180 y CSV-1203 //creativyst.com/Doc/Articles/CSV/CSV01.htm).
ashleedawg
C # / IronPython File.GetLastWriteTimeUtc ("your-path-here"). ToString ("yyyy-% m-% d% H:% MM:% ss")
Konrads
En python con strftime (), el formato también sería "%Y-%m-%d %H:%M:%S"igual que Ruby.
rcronk
18

La sugerencia anterior de usar "aaaa-MM-dd HH: mm: ss" está bien, aunque creo que Excel tiene una resolución de tiempo mucho mejor que esa. Encuentro esta publicación bastante creíble (sigue el hilo y verás mucha aritmética y experimentarás con Excel), y si es correcta, tendrás tus milisegundos. Simplemente puede agregar posiciones decimales al final, es decir, "aaaa-mm-dd hh: mm: ss.000".

Debe tener en cuenta que Excel no necesariamente formatea los datos (sin intervención humana) de tal manera que vea toda esa precisión. En mi computadora en el trabajo, cuando configuro un archivo CSV con datos "aaaa-mm-dd hh: mm: ss.000" (a mano con el Bloc de notas), obtengo "mm: ss.0" en la celda y "m / d / aaaa hh: mm: ss AM / PM "en la barra de fórmulas.

Para obtener la máxima información [1] transmitida en las celdas sin intervención humana, es posible que desee dividir su marca de tiempo en una parte de fecha y una parte de tiempo, con la parte de tiempo solo en el segundo. Me parece que Excel quiere ofrecerle como máximo tres "niveles" visibles (donde las fracciones de segundo son su propio nivel) en cualquier celda, y usted quiere siete: años, meses, días, horas, minutos, segundos, y fracciones de segundo.

O, si no necesita que la marca de tiempo sea legible por humanos, pero desea que sea lo más precisa posible, es posible que prefiera almacenar un número grande (internamente, Excel solo usa el número de días, incluidos los días fraccionarios , desde una fecha de "época").


[1] Es decir, información numérica. Si desea ver la mayor cantidad de información posible pero no le importa hacer cálculos con ella, puede crear algún formato que Excel definitivamente analizará como una cadena y, por lo tanto, dejarlo solo; por ejemplo, "aaaammdd.hhmmss.000".

John Y
fuente
14

El formato "aaaa-MM-dd hh: mm: ss.000" no funciona en todas las configuraciones regionales. Para algunos (al menos en danés) "aaaa-MM-dd hh: mm: ss, 000" funcionará mejor.

usuario662894
fuente
2
Curiosamente, Excel 2010 no detecta fechas en las que la parte de milisegundos es 000. Cualquier otra servirá.
Dio F
4

Creo que si usara el doubletipo de datos, el recálculo en Excel funcionaría bien.

Peter Perháč
fuente
Lo intenté y funciona muy bien. Solo tiene que decirle a Excell que el formato de esa columna en particular es Fecha / Hora. No detectará esto automáticamente desde el CSV ya que obviamente no describe los datos
Peter Perháč
3

Vaya a la configuración de idioma en el Panel de control, luego Opciones de formato, seleccione una configuración regional y vea el formato de fecha real para la configuración regional elegida que Windows utiliza de forma predeterminada. Sí, ese formato de marca de tiempo depende de la configuración regional. Excel usa esos formatos al analizar CSV.

Aún más, si la configuración regional utiliza caracteres más allá de ASCII, tendrá que emitir CSV en la página de códigos "ANSI" de Windows pre-Unicode correspondiente, por ejemplo, CP1251. Excel no acepta UTF-8.

John Smith
fuente
1

En cuanto a las zonas horarias. Tengo que almacenar el desplazamiento UTC como segundos desde UTC de esa manera las fórmulas en Excel / OpenOffice pueden eventualmente localizar las fechas y horas. Encontré que esto es más fácil que almacenar cualquier número que tenga un 0 delante. -0900 no se analizaba bien en ningún sistema de hoja de cálculo y era casi imposible capacitar a la gente para hacerlo.

más duro
fuente
1

El formato "aaaa-mm-dd hh: mm: ss.000" no funciona en todas las configuraciones regionales. Para algunos (al menos en danés) "aaaa-mm-dd hh: mm: ss, 000" funcionará mejor.

como respondió el usuario 662894.

Quiero agregar: No intente obtener los microsegundos de, digamos, el tipo de datos datetime2 de SQL Server: Excel no puede manejar más de 3 fracciones de segundo (es decir, milisegundos).

Así que "aaaa-mm-dd hh: mm: ss.000000" no funcionará, y cuando Excel reciba este tipo de cadena (desde el archivo CSV), realizará un redondeo en lugar de un truncamiento .

Esto puede estar bien, excepto cuando importa la precisión de microsegundos, en cuyo caso es mejor NO activar un reconocimiento automático de tipo de datos, sino simplemente mantener la cadena como cadena ...

Hansjp
fuente
0

Supongo que el formato ISO es una buena idea. ( Artículo de Wikipedia , también con información de tiempo)

Fredrik Mörk
fuente
1
(voto negativo; en realidad, no, Excel no reconoce ese formato)
Doug
1
@Doug Acabo de ejecutar una prueba para verificarlo: funciona bien en Office 2010, edición en inglés, probé con mis dos configuraciones locales (sueco, que usa el formato ISO para las fechas, e inglés de EE. UU.). Por interés: ¿en qué entorno te falló? No me sorprende lo más mínimo que funcione para algunos y falle para algunos: Excel no es realmente una maravilla de consistencia en mi experiencia ...
Fredrik Mörk
1
Definitivamente no funciona en Office 2012 para OSX. El único formato "nativo" que Excel parece reconocer en mis pruebas fue MM / DD / AAAA HH: MM: SS; todo lo demás se trató simplemente como texto.
Doug
1
Encontré esta pregunta después de descubrir que Excel no reconocía las fechas en formato ISO en un CSV. En mi opinión, eso es un error en Excel.
billpg
2
Puede ser, @Patrick. Eso fue un poco difícil de probar en 2009 ;-)
Fredrik Mörk
0

Pruebe el formato MM / dd / aaaa hh: mm: ss.

Código Java para crear un archivo XML.

xmlResponse.append ("mydate>"). append (this.formatDate (resultSet.getTimestamp ("fecha"), "MM / dd / aaaa hh: mm: ss a")). append ("");

public String formatDate(Date date, String format)
{
    String dateString = "";
    if(null != date)
    {
        SimpleDateFormat dateFormat = new SimpleDateFormat(format);
        dateString = dateFormat.format(date);
    }
    return dateString;
}
Anoop Velluva
fuente
0

Entonces, extrañamente Excel importa una fecha csv de diferentes maneras. Y los muestra de manera diferente según el formato utilizado en el archivo csv. Desafortunadamente, el formato ISO 8061 viene como una cadena. Lo que le impide posiblemente reformatear la fecha usted mismo.

Todos los que vienen como una fecha ... contienen toda la información ... pero tienen un formato diferente ... si no te gusta, puedes elegir un nuevo formato para la columna en Excel y funcionará. (Nota: puede decir que llegó como una fecha / hora válida, ya que se justificará a la derecha ... si viene como una cadena, se justificará a la izquierda)

Estos son los formatos que probé:

"aaaa-MM-dd" aparece como una fecha, por supuesto, cuando se abre en Excel. (también funciona "MM / dd / aaaa")

"aaaa-MM-dd HH: mm: ss" el formato de visualización predeterminado es "MM / dd / aaaa HH: mm" (fecha y hora sin segundos)

"aaaa-MM-dd HH: mm: ss.fff" el formato de visualización predeterminado es "HH: mm: ss" (tiempo solo en segundos)

Brian Rice
fuente
-1

Dado un archivo csv con una columna de fecha y hora en este formato: aaaa-mm-dd hh: mm: ss

Excel lo muestra en este formato: dd / mm / aaaa hh: mm

Por ejemplo, 2020-05-22 16:40:55 se muestra como 22/05/2020 16:40

Evidentemente, esto está determinado por el formato de fecha corta y hora corta seleccionados en Windows; por ejemplo, si cambio el formato de fecha corta en Windows a aaaa-mm-dd, Excel muestra 2020-05-22 16:40.

Es molesto, no puedo encontrar ninguna forma de hacer que Excel muestre los segundos automáticamente (tengo que formatear manualmente la columna en Excel). Pero si el archivo csv incluye una columna de tiempo en formato hh: mm: ss (por ejemplo, 16:40:55), eso es lo que se muestra en Excel, incluidos los segundos.

usuario13608643
fuente