WEKA анализирует мою дату с помощью SimpleDateFormat …. если только это не связано с 2 часами

#java #weka #simpledateformat #arff

#java #weka #simpledateformat #arff

Вопрос:

У меня есть большой файл ARFF с данными, который выглядит примерно так:

 555,"2011-03-13 01:50:48.000",0
540,"2011-03-13 02:10:19.000",0
  

Чтобы облегчить его анализ, я объявил второй атрибут следующим образом:

 @attribute RecordedOn date "yyyy-MM-dd HH:mm:ss.SSS"
  

Анализатор, который использует Java SimpleDateFormat, отлично работает с первой строкой (и парой миллионов строк, которые очень похожи на нее), но захлебывается на нескольких строках, как и вторая. Я заметил, что он блокирует только одну строку, час которой равен «02» — фактически, вторая строка обрабатывается нормально, если я изменяю ее на 540,"2011-03-13 01:10:19.000",0 . Чтобы добавить загадочности, некоторые строки с 02 в любом случае анализируются нормально. Нравится: 1,"2006-12-16 02:58:51.000",111

Итак, кто-нибудь знает, что происходит? Какой-нибудь совет? Заранее спасибо.

Ответ №1:

Вы почти наверняка интерпретируете даты как местное время в часовом поясе, в котором соблюдается летнее время. 13 марта 2011 года в Соединенных Штатах началось переход на летнее время; это означает, что часы переводятся с 01: 59: 59 на 03:00:00, пропуская все 2 часа. «2011-03-13 02:10:19.000» местное время никогда не было, например, в Нью-Йорке.

Комментарии:

1. Вау, хорошее решение. Вы абсолютно правы — другие проблемы включают 9 марта 2008 и 11 марта 2007. Для этого конкретного набора данных я только что прокомментировал затронутые строки. Но для будущих, я думаю, мне нужно исследовать, как были установлены часы на датчиках. Поскольку я не могу изменить язык напрямую, было бы лучшим решением написать скрипт для преобразования всего в стандартное время?

2. Глядя на JavaDoc, SimpleDateFormat имеет метод «setTimeZone», который вы могли бы установить в GMT, таким образом интерпретируя даты в часовом поясе, в котором не соблюдается летнее время. Это должно решить вашу проблему, если у вас нет датчиков в разных часовых поясах, которые вам нужно сравнить.

Ответ №2:

У меня была такая же проблема с некоторыми данными, и я мог бы использовать это, изменив свой системный часовой пояс на America / Phoenix (поскольку они не используют летнее время). Другое решение, которое я нашел позже, — просто изменить часовой пояс JVM при запуске WEKA (https://www.baeldung.com/java-jvm-time-zone )