Najlepszy format znacznika czasu dla CSV / Excel?

110

Piszę plik CSV. Muszę pisać znaczniki czasu z dokładnością co najmniej do sekundy, a najlepiej z dokładnością do milisekundy. Jaki jest najlepszy format sygnatur czasowych w pliku CSV, tak aby można je było przeanalizować dokładnie i jednoznacznie w programie Excel przy minimalnej interwencji użytkownika?


źródło
w jakim języku tworzysz wynik?
Peter Perháč

Odpowiedzi:

104

W przypadku drugiej dokładności, rrrr-MM-dd HH: mm: ss powinno załatwić sprawę.

Uważam, że Excel nie jest zbyt dobry z ułamkami sekundy (traci je podczas interakcji z obiektem COM IIRC).

Joe
źródło
Tak - zgadzam się z tobą i Fredrikiem. Gdybyś mógł odszukać te odniesienia, z pewnością byłbym wdzięczny. Dzięki!
18
Dla każdego, kto używa Rubiego strftime, równoważny ciąg argumentów to"%Y-%m-%d %H:%M:%S"
Greg Matthew Crossley
2
@nickf - .CSVto tylko plik tekstowy. Możesz pokazać strefę czasową lub cokolwiek innego, co napiszesz do pliku jako zwykły tekst oddzielony przecinkami; Ważne jest to, co aplikacja będzie czytanie go, i jak to aplikacja spodziewa tekst. Oto dokumentacja standardu CSV z Biblioteki Kongresu. Nie ma określonego sposobu na konkretne przechowywanie dat. Również RFC-4180 i CSV-1203 //creativyst.com/Doc/Articles/CSV/CSV01.htm).
ashleedawg
C # / IronPython File.GetLastWriteTimeUtc ("twoja-ścieżka-tutaj"). ToString ("yyyy-% m-% d% H:% MM:% ss")
Konrads
W Pythonie ze strftime () format również byłby "%Y-%m-%d %H:%M:%S"- taki sam jak Ruby.
rcronk
18

Wcześniejsza sugestia użycia „rrrr-MM-dd HH: mm: ss” jest w porządku, chociaż uważam, że Excel ma znacznie lepszą rozdzielczość czasową niż ta. Uważam, że ten post jest raczej wiarygodny (podążaj za wątkiem, a zobaczysz dużo arytmetyki i eksperymentów z Excelem), a jeśli jest poprawny, będziesz miał swoje milisekundy. Możesz po prostu dodać miejsca dziesiętne na końcu, np. „Rrrr-mm-dd gg: mm: ss.000”.

Należy pamiętać, że program Excel niekoniecznie może formatować dane (bez udziału człowieka) w taki sposób, aby można było zobaczyć całą tę precyzję. Gdy na moim komputerze w pracy konfiguruję plik CSV z danymi „rrrr-mm-dd gg: mm: ss.000” (ręcznie przy użyciu Notatnika), w komórce pojawia się „mm: ss.0” i „m / d / rrrr gg: mm: ss AM / PM ”na pasku formuły.

Aby uzyskać jak najwięcej informacji [1] przekazywanych w komórkach bez interwencji człowieka, możesz podzielić swój znacznik czasu na część z datą i część z godziną, przy czym część czasowa jest podawana tylko z dokładnością do sekundy. Wydaje mi się, że Excel chce podać co najwyżej trzy widoczne „poziomy” (gdzie ułamki sekundy są ich własnym poziomem) w dowolnej komórce, a chcesz siedem: lat, miesięcy, dni, godzin, minut, sekund, i ułamki sekundy.

Lub, jeśli nie potrzebujesz sygnatury czasowej, aby była czytelna dla człowieka, ale chcesz, aby była jak najdokładniejsza, możesz po prostu przechowywać dużą liczbę (wewnętrznie program Excel używa tylko liczby dni, w tym dni ułamkowych od daty „epoki”).


[1] To znaczy informacje liczbowe. Jeśli chcesz zobaczyć jak najwięcej informacji, ale nie przejmujesz się wykonywaniem na nich obliczeń, możesz wymyślić jakiś format, który Excel z pewnością przeanalizuje jako ciąg, a tym samym zostawić w spokoju; np. „rrrrmmdd.ggmmss.000”.

John Y
źródło
14

Format „rrrr-MM-dd gg: mm: ss.000” nie działa we wszystkich lokalizacjach. W przypadku niektórych (przynajmniej duńskich) „rrrr-MM-dd gg: mm: ss, 000” będzie działać lepiej.

user662894
źródło
2
O dziwo, Excel 2010 nie wykrywa dat, w których część milisekundowa to 000. Każda inna.
Dio F
4

Myślę, że gdybyś użył doubletypu danych, ponowne obliczenie w programie Excel działałoby dobrze.

Peter Perháč
źródło
Właśnie spróbowałem i działa naprawdę fajnie. Muszę tylko powiedzieć Excellowi, że format tej konkretnej kolumny to Data / Godzina. Nie wykryje tego automatycznie z
pliku
3

Przejdź do ustawień języka w Panelu sterowania, a następnie Opcje formatu, wybierz lokalizację i zobacz rzeczywisty format daty dla wybranej lokalizacji używanej domyślnie przez system Windows. Tak, ten format znacznika czasu jest wrażliwy na ustawienia regionalne. Excel używa tych formatów podczas analizowania CSV.

Co więcej, jeśli ustawienia regionalne używają znaków spoza ASCII, będziesz musiał emitować CSV na odpowiedniej stronie kodowej „ANSI” systemu Windows poprzedzającej kodowanie Unicode, np. CP1251. Excel nie akceptuje UTF-8.

John Smith
źródło
1

Jeśli chodzi o strefy czasowe. Muszę przechowywać przesunięcie czasu UTC w sekundach od czasu UTC, aby formuły w programie Excel / OpenOffice mogły ostatecznie zlokalizować czasy danych. Okazało się, że jest to łatwiejsze niż przechowywanie dowolnej liczby, która ma przed sobą 0. -0900 nie przeanalizował dobrze w żadnym systemie arkuszy kalkulacyjnych, a zaimportowanie było prawie niemożliwe do wyszkolenia ludzi.

Whardier
źródło
1

Format „rrrr-mm-dd gg: mm: ss.000” nie działa we wszystkich lokalizacjach. Dla niektórych (przynajmniej duńskich) „rrrr-mm-dd gg: mm: ss, 000” będzie działać lepiej.

jak odpowiedział użytkownik662894.

Chcę dodać: Nie próbuj uzyskiwać mikrosekund z, powiedzmy, typu danych datetime2 programu SQL Server: program Excel nie obsługuje więcej niż 3 ułamkowe sekundy (tj. Milisekundy).

Tak więc „rrrr-mm-dd gg: mm: ss.000000” nie zadziała, a gdy Excel jest podawany w tego rodzaju ciąg (z pliku CSV), będzie wykonywał zaokrąglanie, a nie obcięcie .

Może to być w porządku, z wyjątkiem sytuacji, gdy liczy się precyzja w mikrosekundach, w którym to przypadku lepiej jest NIE wyzwalać automatycznego rozpoznawania typu danych, ale po prostu zachować ciąg jako ciąg ...

Hansjp
źródło
0

Domyślam się, że format ISO to dobry pomysł. ( Artykuł w Wikipedii , również z informacją o czasie)

Fredrik Mörk
źródło
1
(głos przeciw; właściwie nie, program Excel nie rozpoznaje tego formatu)
Doug,
1
@Doug Właśnie przeprowadziłem test, aby to sprawdzić: działa dobrze w pakiecie Office 2010, wersja angielska, wypróbowałem zarówno z moimi ustawieniami lokalnymi (szwedzki, który używa formatu ISO dla dat, jak i angielski amerykański). Z zainteresowania: w jakim środowisku ci się to nie udało? Nie jestem najmniej zaskoczony, że to działa dla niektórych, a dla niektórych zawodzi: Excel nie jest tak naprawdę cudem spójności w moim doświadczeniu ...
Fredrik Mörk
1
Zdecydowanie nie działa w pakiecie Office 2012 na OSX. Jedynym rodzimym formatem programu Excel, który wydaje się rozpoznawać w moich testach, był MM / DD / RRRR GG: MM: SS; wszystko inne było po prostu traktowane jako tekst.
Doug
1
Znalazłem to pytanie po stwierdzeniu, że program Excel nie rozpoznał dat w formacie ISO w pliku CSV. IMO, to błąd w programie Excel.
billpg
2
To może być @Patrick. To było trochę trudne do przetestowania w 2009 roku ;-)
Fredrik Mörk
0

Wypróbuj format MM / dd / rrrr hh: mm: ss.

Kod Java do tworzenia pliku XML.

xmlResponse.append ("mydate>"). append (this.formatDate (resultSet.getTimestamp ("date"), "MM / dd / rrrr 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
źródło
0

Więc dziwnie Excel importuje datę w formacie csv na różne sposoby. I wyświetla je w różny sposób w zależności od formatu używanego w pliku csv. Niestety format ISO 8061 jest dostępny jako ciąg. To zapobiega ewentualnemu samodzielnemu sformatowaniu daty.

Wszystkie te, które pojawiają się jako data ... zawierają wszystkie informacje ... ale mają inny format ... jeśli ci się nie podoba, możesz wybrać nowy format kolumny w programie Excel i będzie działać. (Uwaga: możesz powiedzieć, że przyszedł jako poprawna data / godzina, ponieważ będzie to dobrze uzasadniać ... jeśli pojawi się jako ciąg, zostanie wyjustowany)

Oto formaty, które przetestowałem:

„yyyy-MM-dd” pojawia się oczywiście jako data po otwarciu w programie Excel. (działa również „MM / dd / yyyy”)

Domyślny format wyświetlania „rrrr-MM-dd HH: mm: ss” to „MM / dd / rrrr HH: mm” (data i godzina bez sekund)

Domyślny format wyświetlania „rrrr-MM-dd HH: mm: ss.fff” to „HH: mm: ss” (tylko czas z sekundami)

Brian Rice
źródło
-1

Biorąc pod uwagę plik csv z kolumną z datą i godziną w tym formacie: rrrr-mm-dd gg: mm: ss

Excel pokazuje to w tym formacie: dd / mm / rrrr gg: mm

np. 2020-05-22 16:40:55 pokazuje się jako 22/05/2020 16:40

Jest to wyraźnie określone przez format daty krótkiej i czasu krótkiego wybrany w systemie Windows; na przykład, jeśli zmienię format daty krótkiej w systemie Windows na rrrr-mm-dd, program Excel wyświetli 2020-05-22 16:40.

Irytujące jest to, że nie mogę znaleźć sposobu, aby Excel automatycznie wyświetlał sekundy (muszę ręcznie sformatować kolumnę w Excelu). Ale jeśli plik csv zawiera kolumnę czasu w formacie gg: mm: ss (np. 16:40:55), to jest to, co pokazuje Excel, łącznie z sekundami.

user13608643
źródło