Лучший формат метки времени для CSV / Excel?

110

Пишу файл CSV. Мне нужно писать метки времени с точностью не менее секунды, а желательно до миллисекунды. Какой лучший формат для временных меток в файле CSV, чтобы они могли быть точно и однозначно проанализированы Excel с минимальным вмешательством пользователя?


источник
какой язык вы используете для создания вывода?
Петер Перхач,

Ответы:

104

Для второй точности yyyy-MM-dd HH: mm: ss подойдет.

Я считаю, что Excel не очень хорош с долями секунды (теряет их при взаимодействии с COM-объектом IIRC).

Джо
источник
Да, я согласен с тобой и Фредриком. Если бы вы могли откопать эти ссылки, я был бы непременно признателен. Спасибо!
18
Для всех, кто использует Ruby strftime, эквивалентная строка аргументов"%Y-%m-%d %H:%M:%S"
Грег Мэтью Кроссли,
2
@nickf - .CSVэто просто текстовый файл. Вы можете показать часовой пояс или что-нибудь еще, что вы записываете в файл, в виде обычного текста, разделенного запятыми; важно то, какое приложение будет его читать и как это приложение ожидает текст. Вот документация по стандарту CSV из Библиотеки Конгресса. Не существует предписанного способа хранения фиников. Также RFC-4180 и CSV-1203 //creativyst.com/Doc/Articles/CSV/CSV01.htm).
ashleedawg
C # / IronPython File.GetLastWriteTimeUtc ("your-path-here"). ToString ("yyyy-% m-% d% H:% MM:% ss")
Конрадс
В python с strftime () формат также будет "%Y-%m-%d %H:%M:%S"таким же, как в Ruby.
rcronk
18

Предыдущее предложение использовать «yyyy-MM-dd HH: mm: ss» нормально, хотя я считаю, что Excel имеет гораздо более точное временное разрешение, чем это. Я считаю этот пост довольно достоверным (следите за темой, и вы увидите много арифметических операций и экспериментов с Excel), и если это правильно, у вас будут свои миллисекунды. Вы можете просто добавить десятичные знаки в конце, например «гггг-мм-дд чч: мм: сс.000».

Вы должны знать, что Excel не обязательно может форматировать данные (без вмешательства человека) таким образом, чтобы вы могли увидеть всю эту точность. На рабочем компьютере, когда я настраиваю CSV с данными «гггг-мм-дд чч: мм: сс.000» (вручную с помощью Блокнота), я получаю «мм: сс.0» в ячейке и «м / д / гггг чч: мм: сс AM / PM "в строке формул.

Для получения максимальной информации [1], передаваемой в ячейках без вмешательства человека, вы можете разделить метку времени на часть даты и часть времени, причем часть времени будет составлять только секунды. Мне кажется, что Excel хочет дать вам не более трех видимых «уровней» (где доли секунды - их собственный уровень) в любой ячейке, а вам нужно семь: годы, месяцы, дни, часы, минуты, секунды, и доли секунды.

Или, если вам не нужно, чтобы временная метка была удобочитаемой, но вы хотите, чтобы она была максимально точной, вы можете предпочесть просто хранить большое число (внутри Excel просто использует количество дней, включая дробные дни , начиная с даты "эпохи").


[1] То есть числовая информация. Если вы хотите видеть как можно больше информации, но не хотите проводить с ней вычисления, вы можете придумать какой-нибудь формат, который Excel определенно проанализирует как строку и, таким образом, оставит в покое; например, «ггггммдд.ччммсс.000».

Джон Y
источник
14

Формат «гггг-мм-дд чч: мм: сс.000» работает не во всех регионах. Для некоторых (по крайней мере, датских) "гггг-мм-дд чч: мм: сс, 000" подойдет лучше.

user662894
источник
2
Как ни странно, Excel 2010 не определяет даты, когда часть миллисекунды равна 000. Подойдет любое другое.
Dio F
4

Я считаю, что если бы вы использовали этот doubleтип данных, пересчет в Excel работал бы нормально.

Петер Перхач
источник
Я просто попробовал, и это действительно хорошо работает. Просто нужно сообщить Excell, что формат этого конкретного столбца - Дата / Время. Он не обнаружит это автоматически из CSV, поскольку он, очевидно, не описывает данные
Питер Перхач
3

Перейдите к настройкам языка на панели управления, затем к параметрам формата, выберите языковой стандарт и просмотрите фактический формат даты для выбранного языкового стандарта, используемого Windows по умолчанию. Да, этот формат метки времени зависит от локали. Excel использует эти форматы при анализе CSV.

Более того, если языковой стандарт использует символы помимо ASCII, вам придется передать CSV в соответствующей кодовой странице «ANSI» Windows до Unicode, например CP1251. Excel не принимает UTF-8.

Джон Смит
источник
1

Что касается часовых поясов. Мне нужно сохранить смещение UTC в секундах от UTC, поэтому формулы в Excel / OpenOffice могут в конечном итоге локализовать дату и время. Я обнаружил, что это проще, чем хранить любое число, перед которым стоит 0. -0900 плохо разбирался ни в одной системе электронных таблиц, и при импорте было практически невозможно обучить людей этому.

труднее
источник
1

Формат «гггг-мм-дд чч: мм: сс.000» работает не во всех регионах. Для некоторых (по крайней мере, датских) "гггг-мм-дд чч: мм: сс, 000" подойдет лучше.

как ответил user662894.

Я хочу добавить: не пытайтесь получить микросекунды, скажем, из типа данных datetime2 SQL Server: Excel не может обрабатывать более 3 долевых секунд (то есть миллисекунд).

Таким образом, «гггг-мм-дд чч: мм: сс.000000» не будет работать, и когда Excel загружает такую ​​строку (из файла CSV), он будет выполнять округление, а не усечение .

Это может быть хорошо, за исключением случаев, когда точность в микросекундах имеет значение, и в этом случае вам лучше НЕ запускать автоматическое распознавание типа данных, а просто сохранить строку как строку ...

Hansjp
источник
0

Думаю, формат ISO - хорошая идея. ( Статья в Википедии , также с информацией о времени)

Фредрик Мёрк
источник
1
(голос против; на самом деле нет, Excel не распознает этот формат)
Дуг
1
@Doug Я только что провел тест, чтобы проверить: отлично работает в Office 2010, английская версия, пробовал использовать обе мои локальные настройки (шведский, который использует формат ISO для дат, и американский английский). Из интереса: в каких условиях он у вас отказал? Я нисколько не удивлен, что для некоторых это работает, а для некоторых - нет: Excel на самом деле не является чудом согласованности в моем опыте ...
Фредрик Мерк,
1
Это определенно не работает в Office 2012 для OSX. Единственным «родным» форматом, который Excel распознал в моем тестировании, был MM / DD / YYYY HH: MM: SS; все остальное рассматривалось просто как текст.
Дуг
1
Я нашел этот вопрос после того, как обнаружил, что Excel не распознает даты формата ISO в CSV. ИМО, это ошибка в Excel.
billpg
2
Может быть, @Patrick. Это было немного сложно проверить в 2009 году ;-)
Фредрик Мёрк
0

Попробуйте формат MM / dd / yyyy hh: mm: ss.

Код Java для создания файла 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;
}
Ануп Веллува
источник
0

Итак, как ни странно, Excel импортирует дату в формате CSV разными способами. И отображает их по-разному в зависимости от формата, используемого в файле csv. К сожалению, формат ISO 8061 представляет собой строку. Это не позволяет вам самостоятельно переформатировать дату.

Все те, которые представлены в виде даты ... содержат всю информацию ... но они форматируются по-разному ... если вам это не нравится, вы можете выбрать новый формат для столбца в Excel, и он будет работать. (Примечание: вы можете сказать, что он был введен как допустимая дата / время, так как он будет выровнен по правому краю ... если он входит в виде строки, он будет выровнен по левому краю)

Вот форматы, которые я тестировал:

"гггг-ММ-дд", конечно, отображается как дата при открытии в Excel. (также работает "MM / dd / yyyy")

"гггг-мм-дд ЧЧ: мм: сс" по умолчанию формат отображения "ММ / дд / гггг ЧЧ: мм" (дата и время без секунд)

Формат отображения по умолчанию «гггг-мм-дд ЧЧ: мм: сс.fff» - «ЧЧ: мм: сс» (только время с / сек).

Брайан Райс
источник
-1

Для файла csv со столбцом datetime в следующем формате: гггг-мм-дд чч: мм: сс

Excel показывает это в следующем формате: дд / мм / гггг чч: мм

например, 2020-05-22 16:40:55 отображается как 22/05/2020 16:40

Очевидно, это определяется выбранным в Windows форматом краткой даты и кратким временем; например, если я изменю формат краткой даты в Windows на гггг-мм-дд, Excel покажет 2020-05-22 16:40.

К сожалению, я не могу найти способ заставить Excel автоматически отображать секунды (мне приходится вручную форматировать столбец в Excel). Но если файл csv включает столбец времени в формате чч: мм: сс (например, 16:40:55), это то, что отображается в Excel, включая секунды.

user13608643
источник