Meilleur format d'horodatage pour CSV / Excel?

110

J'écris un fichier CSV. J'ai besoin d'écrire des horodatages précis au moins à la seconde, et de préférence à la milliseconde. Quel est le meilleur format pour les horodatages dans un fichier CSV afin qu'ils puissent être analysés avec précision et sans ambiguïté par Excel avec une intervention minimale de l'utilisateur?


la source
quelle langue utilisez-vous pour créer la sortie?
Peter Perháč le

Réponses:

104

Pour une seconde précision, aaaa-MM-jj HH: mm: ss devrait faire l'affaire.

Je pense qu'Excel n'est pas très bon avec des fractions de seconde (les perd lors de l'interaction avec l'objet COM IIRC).

Joe
la source
Ouais - je suis d'accord avec toi et Fredrik. Si vous pouviez trouver ces références, je vous en serais certainement reconnaissant. Merci!
18
Pour toute personne utilisant Ruby strftime, la chaîne d'argument équivalente est"%Y-%m-%d %H:%M:%S"
Greg Matthew Crossley
2
@nickf - .CSVest juste un fichier texte. Vous pouvez afficher le fuseau horaire ou tout autre élément que vous écrivez dans le fichier sous forme de texte brut séparé par des virgules; ce qui est important, c'est quelle application va le lire et comment cette application attend le texte. Voici la documentation de la norme CSV de la Bibliothèque du Congrès. Il n'existe aucun moyen prescrit de stocker spécifiquement les dates. Aussi RFC-4180 et CSV-1203 //creativyst.com/Doc/Articles/CSV/CSV01.htm).
ashleedawg
C # / IronPython File.GetLastWriteTimeUtc ("votre-chemin-ici"). ToString ("aaaa-% m-% d% H:% MM:% ss")
Konrads
En python avec strftime (), le format serait également "%Y-%m-%d %H:%M:%S"- le même que Ruby.
rcronk le
18

La suggestion précédente d'utiliser "aaaa-MM-jj HH: mm: ss" est très bien, même si je pense qu'Excel a une résolution temporelle beaucoup plus fine que cela. Je trouve ce post plutôt crédible (suivez le fil et vous verrez beaucoup d'arithmétique et d'expérimentation avec Excel), et s'il est correct, vous aurez vos millisecondes. Vous pouvez simplement virer les décimales à la fin, c'est-à-dire "aaaa-mm-jj hh: mm: ss.000".

Vous devez être conscient qu'Excel ne formate pas nécessairement les données (sans intervention humaine) de manière à ce que vous puissiez voir toute cette précision. Sur mon ordinateur au travail, lorsque je configure un fichier CSV avec des données "aaaa-mm-jj hh: mm: ss.000" (à la main à l'aide du Bloc-notes), j'obtiens "mm: ss.0" dans la cellule et "m / j / aaaa hh: mm: ss AM / PM "dans la barre de formule.

Pour obtenir un maximum d'informations [1] transmises dans les cellules sans intervention humaine, vous souhaiterez peut-être diviser votre horodatage en une partie de date et une partie d'heure, avec la partie d'heure uniquement à la seconde. Il me semble qu'Excel veut vous donner au plus trois "niveaux" visibles (où les fractions de seconde sont leur propre niveau) dans une cellule donnée, et vous en voulez sept: années, mois, jours, heures, minutes, secondes, et des fractions de seconde.

Ou, si vous n'avez pas besoin que l'horodatage soit lisible par l'homme mais que vous voulez qu'il soit aussi précis que possible, vous préférerez peut-être simplement stocker un grand nombre (en interne, Excel utilise simplement le nombre de jours, y compris les jours fractionnaires , depuis une date "d'époque").


[1] Autrement dit, des informations numériques. Si vous voulez voir autant d'informations que possible mais que vous ne vous souciez pas de faire des calculs avec elle, vous pouvez créer un format qu'Excel analysera certainement comme une chaîne et laissera ainsi seul; par exemple "aaaammjj.hhmmss.000".

John Y
la source
14

Le format "aaaa-MM-jj hh: mm: ss.000" ne fonctionne pas dans tous les paramètres régionaux. Pour certains (au moins danois) "aaaa-MM-jj hh: mm: ss, 000" fonctionnera mieux.

user662894
la source
2
Étrangement, Excel 2010 ne détecte pas les dates où la partie milliseconde est 000. Tout autre fera l'affaire.
Dio F
4

Je pense que si vous utilisiez le doubletype de données, le recalcul dans Excel fonctionnerait très bien.

Peter Perháč
la source
J'ai juste essayé et ça marche vraiment bien. Il suffit de dire à Excell que le format de cette colonne particulière est Date / Heure. Il ne détectera pas cela automatiquement à partir du CSV car il ne décrit évidemment pas les données
Peter Perháč
3

Accédez aux paramètres de langue dans le Panneau de configuration, puis Options de format, sélectionnez un paramètre régional et voyez le format de date réel pour le paramètre régional choisi utilisé par Windows par défaut. Oui, ce format d'horodatage est sensible aux paramètres régionaux. Excel utilise ces formats lors de l'analyse CSV.

De plus, si les paramètres régionaux utilisent des caractères au-delà de ASCII, vous devrez émettre CSV dans la page de codes Windows "ANSI" pré-Unicode correspondante, par exemple CP1251. Excel n'acceptera pas UTF-8.

John Smith
la source
1

Quant aux fuseaux horaires. Je dois stocker le décalage UTC en secondes par rapport à UTC de cette façon, les formules dans Excel / OpenOffice peuvent éventuellement localiser les dates et heures. J'ai trouvé que c'était plus facile que de stocker n'importe quel nombre qui a un 0 devant lui. -0900 n'a pas été bien analysé dans aucun système de feuille de calcul et il était presque impossible de former les gens à le faire.

whardier
la source
1

Le format "aaaa-mm-jj hh: mm: ss.000" ne fonctionne pas dans tous les paramètres régionaux. Pour certains (au moins danois) "aaaa-mm-jj hh: mm: ss, 000" fonctionnera mieux.

comme répondu par user662894.

Je veux ajouter: n'essayez pas d'obtenir les microsecondes à partir, par exemple, du type de données datetime2 de SQL Server: Excel ne peut pas gérer plus de 3 fractions de seconde (c.-à-d. Millisecondes).

Donc "aaaa-mm-jj hh: mm: ss.000000" ne fonctionnera pas, et quand Excel reçoit ce type de chaîne (à partir du fichier CSV), il effectuera un arrondi plutôt qu'une troncature .

Cela peut être bien sauf lorsque la précision de la microseconde compte, auquel cas il vaut mieux NE PAS déclencher une reconnaissance automatique du type de données mais simplement garder la chaîne sous forme de chaîne ...

Hansjp
la source
0

Je suppose que le format ISO est une bonne idée. ( Article Wikipédia , également avec des informations sur l'heure)

Fredrik Mörk
la source
1
(vote défavorable; en fait, non, Excel ne reconnaît pas ce format)
Doug
1
@Doug Je viens de lancer un test pour le vérifier: fonctionne bien dans Office 2010, édition anglaise, essayé avec mes paramètres locaux (suédois, qui utilise le format ISO pour les dates, et anglais américain). Par intérêt: dans quel environnement a-t-il échoué pour vous? Je ne suis pas du tout surpris que cela fonctionne pour certains et échoue pour certains: Excel n'est pas vraiment une merveille de cohérence dans mon expérience ...
Fredrik Mörk
1
Cela ne fonctionne certainement pas dans Office 2012 pour OSX. Le seul format «natif» que Excel semble reconnaître dans mes tests était MM / JJ / AAAA HH: MM: SS; tout le reste était simplement traité comme du texte.
Doug
1
J'ai trouvé cette question après avoir constaté qu'Excel ne reconnaissait pas les dates au format ISO dans un CSV. IMO, c'est un bogue dans Excel.
billpg
2
C'est peut-être, @Patrick. C'était un peu difficile à tester en 2009 ;-)
Fredrik Mörk
0

Essayez MM / jj / aaaa hh: mm: ss un format.

Code Java pour créer un fichier XML.

xmlResponse.append ("mydate>"). append (this.formatDate (resultSet.getTimestamp ("date"), "MM / dd / yyyy 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
la source
0

Donc, bizarrement, Excel importe une date csv de différentes manières. Et affiche différemment selon le format utilisé dans le fichier csv. Malheureusement, le format ISO 8061 se présente sous forme de chaîne. Ce qui vous empêche de reformater vous-même la date.

Tous ceux qui sont fournis sous forme de date ... contiennent toutes les informations ... mais ils se mettent en forme différemment ... si vous ne l'aimez pas, vous pouvez choisir un nouveau format pour la colonne dans Excel et cela fonctionnera. (Remarque: vous pouvez dire qu'il est entré comme une date / heure valide car il justifiera à droite ... s'il entre sous forme de chaîne, il justifiera à gauche)

Voici les formats que j'ai testés:

"aaaa-MM-jj" apparaît bien sûr comme une date lorsqu'il est ouvert dans Excel. (aussi "MM / jj / aaaa" fonctionne)

Le format d'affichage par défaut "aaaa-MM-jj HH: mm: ss" est "MM / jj / aaaa HH: mm" (date et heure sans secondes)

"aaaa-MM-jj HH: mm: ss.fff" Le format d'affichage par défaut est "HH: mm: ss" (heure uniquement w / secondes)

Brian Rice
la source
-1

Étant donné un fichier csv avec une colonne datetime dans ce format: aaaa-mm-jj hh: mm: ss

Excel l'affiche dans ce format: jj / mm / aaaa hh: mm

Par exemple, 2020-05-22 16:40:55 apparaît comme 22/05/2020 16:40

Ceci est évidemment déterminé par le format de date courte et d'heure courte sélectionné dans Windows; par exemple, si je change le format de date courte dans Windows en aaaa-mm-jj, Excel affiche 2020-05-22 16:40.

Malheureusement, je ne trouve aucun moyen pour qu'Excel affiche automatiquement les secondes (je dois formater manuellement la colonne dans Excel). Mais si le fichier csv comprend une colonne d'heure au format hh: mm: ss (par exemple 16:40:55), c'est ce qui s'affiche dans Excel, y compris les secondes.

user13608643
la source