Estou escrevendo um arquivo CSV. Preciso escrever carimbos de data / hora precisos pelo menos no segundo e, de preferência, no milissegundo. Qual é o melhor formato para carimbos de data / hora em um arquivo CSV, de forma que possam ser analisados com precisão e sem ambigüidade pelo Excel com mínima intervenção do usuário?
110
Respostas:
Para uma segunda precisão, aaaa-MM-dd HH: mm: ss deve resolver.
Acredito que o Excel não seja muito bom com frações de segundo (perde-as ao interagir com o objeto COM IIRC).
fonte
strftime
, a string de argumento equivalente é"%Y-%m-%d %H:%M:%S"
.CSV
é apenas um arquivo de texto. Você pode mostrar o fuso horário ou qualquer outra coisa que você escrever no arquivo como texto simples separado por vírgulas; o que é importante é qual aplicativo o lerá e como esse aplicativo espera o texto. Aqui está a documentação para o padrão CSV da Biblioteca do Congresso. Não existe uma maneira prescrita de armazenar datas especificamente. Também RFC-4180 e CSV-1203 //creativyst.com/Doc/Articles/CSV/CSV01.htm)."%Y-%m-%d %H:%M:%S"
- o mesmo que Ruby.A sugestão anterior de usar "aaaa-MM-dd HH: mm: ss" é adequada, embora eu acredite que o Excel tenha uma resolução de tempo muito mais precisa do que essa. Acho este post bastante confiável (siga o tópico e você verá muita aritmética e experiências com o Excel) e, se estiver correto, você terá seus milissegundos. Você pode apenas adicionar casas decimais no final, por exemplo, "aaaa-mm-dd hh: mm: ss.000".
Você deve estar ciente de que o Excel pode não necessariamente formatar os dados (sem intervenção humana) de forma que você veja toda essa precisão. No meu computador no trabalho, quando configuro um CSV com dados "aaaa-mm-dd hh: mm: ss.000" (manualmente usando o Bloco de notas), obtenho "mm: ss.0" na célula e "m / d / aaaa hh: mm: ss AM / PM "na barra de fórmulas.
Para obter o máximo de informações [1] transmitidas nas células sem intervenção humana, você pode querer dividir seu registro de data e hora em uma porção de data e uma porção de tempo, com a porção de tempo apenas em segundos. Parece-me que o Excel quer dar a você no máximo três "níveis" visíveis (onde as frações de segundo são seus próprios níveis) em qualquer célula, e você deseja sete: anos, meses, dias, horas, minutos, segundos, e frações de segundo.
Ou, se você não precisa que o carimbo de data / hora seja legível, mas deseja que seja o mais preciso possível, você pode preferir apenas armazenar um número grande (internamente, o Excel usa apenas o número de dias, incluindo dias fracionários , desde uma data de "época").
[1] Ou seja, informações numéricas. Se você deseja ver o máximo de informações possível, mas não se preocupa em fazer cálculos com elas, pode criar algum formato que o Excel irá definitivamente analisar como uma string e, portanto, deixar sozinho; por exemplo, "aaaammdd.hhmmss.000".
fonte
O formato "aaaa-MM-dd hh: mm: ss.000" não funciona em todos os locais. Para alguns (pelo menos dinamarqueses) "aaaa-MM-dd hh: mm: ss, 000" funcionará melhor.
fonte
Acredito que se você usasse o
double
tipo de dados, o recálculo no Excel funcionaria perfeitamente.fonte
Vá para as configurações de idioma no Painel de Controle, em Opções de Formato, selecione um local e veja o formato de data real para o local escolhido usado pelo Windows por padrão. Sim, esse formato de carimbo de data / hora é sensível à localidade. O Excel usa esses formatos ao analisar CSV.
Além disso, se o local usar caracteres além do ASCII, você terá que emitir CSV na página de código "ANSI" do Windows pré-Unicode correspondente, por exemplo, CP1251. O Excel não aceita UTF-8.
fonte
Quanto aos fusos horários. Tenho que armazenar o deslocamento do UTC como segundos do UTC para que as fórmulas no Excel / OpenOffice possam eventualmente localizar os horários. Achei isso mais fácil do que armazenar qualquer número que tenha um 0 na frente dele. -0900 não analisava bem em nenhum sistema de planilha e importá-lo era quase impossível de treinar as pessoas para fazer.
fonte
conforme respondido pelo usuário662894.
Eu quero adicionar: não tente obter microssegundos de, digamos, o tipo de dados datetime2 do SQL Server: O Excel não pode lidar com mais de 3 segundos fracionários (ou seja, milissegundos).
Portanto, "aaaa-mm-dd hh: mm: ss.000000" não funcionará e quando o Excel for alimentado com esse tipo de string (do arquivo CSV), ele executará arredondamento em vez de truncamento .
Isso pode ser bom, exceto quando a precisão de microssegundos é importante, caso em que é melhor NÃO acionar um reconhecimento automático de tipo de dados, mas apenas manter a string como string ...
fonte
Eu acho que o formato ISO é uma boa ideia. ( Artigo da Wikipedia , também com informações de tempo)
fonte
Experimente MM / dd / aaaa hh: mm: ss um formato.
Código Java para criar arquivo XML.
fonte
Então, estranhamente, o Excel importa uma data csv de maneiras diferentes. E os exibe de maneira diferente dependendo do formato usado no arquivo csv. Infelizmente, o formato ISO 8061 vem como uma string. O que o impede de reformatar a data por conta própria.
Todos os que vêm em data ... contêm toda a informação ... mas formatam de forma diferente ... se não gostar pode escolher um novo formato para a coluna no excel e vai funcionar. (Observação: você pode dizer que veio como uma data / hora válida, pois será justificado à direita ... se vier como uma string, será justificado à esquerda)
Aqui estão os formatos que testei:
"aaaa-MM-dd" aparece como uma data, claro, quando aberto no Excel. (também funciona "MM / dd / aaaa")
O formato de exibição padrão "aaaa-MM-dd HH: mm: ss" é "MM / dd / aaaa HH: mm" (data e hora sem segundos)
O formato de exibição padrão "aaaa-MM-dd HH: mm: ss.fff" é "HH: mm: ss" (tempo apenas c / segundos)
fonte
Dado um arquivo csv com uma coluna datetime neste formato: aaaa-mm-dd hh: mm: ss
O Excel mostra neste formato: dd / mm / aaaa hh: mm
por exemplo, 2020-05-22 16:40:55 mostra como 22/05/2020 16:40
Isso é evidentemente determinado pelo formato de data abreviada e horário abreviado selecionado no Windows; por exemplo, se eu alterar o formato de data abreviada no Windows para aaaa-mm-dd, o Excel mostrará 2020-05-22 16:40.
Irritantemente, não consigo encontrar nenhuma maneira de fazer o Excel mostrar os segundos automaticamente (tenho que formatar manualmente a coluna no Excel). Mas se o arquivo csv incluir uma coluna de tempo no formato hh: mm: ss (por exemplo, 16:40:55), isso é o que mostra no Excel, incluindo os segundos.
fonte