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?
110
Odpowiedzi:
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).
źródło
strftime
, równoważny ciąg argumentów to"%Y-%m-%d %H:%M:%S"
.CSV
to 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)."%Y-%m-%d %H:%M:%S"
- taki sam jak Ruby.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”.
źródło
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.
źródło
Myślę, że gdybyś użył
double
typu danych, ponowne obliczenie w programie Excel działałoby dobrze.źródło
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.
źródło
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.
źródło
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 ...
źródło
Domyślam się, że format ISO to dobry pomysł. ( Artykuł w Wikipedii , również z informacją o czasie)
źródło
Wypróbuj format MM / dd / rrrr hh: mm: ss.
Kod Java do tworzenia pliku XML.
źródło
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)
źródło
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.
źródło