2011-03-17 5 views
7

Używam funkcji strptime(...) w funkcji mojego pakietu. Muszę przeanalizować ciąg znaków przy użyciu określonych ustawień lokalnych i zastosować Sys.setlocale jako obejście, aby uzyskać angielskie ustawienia lokalizacji. Aby zredukować efekty uboczne, przywrócone zostanie poprzednie ustawienie lokalne. Kod podstawowy fragment funkcji wygląda następująco:Sys.setlocale: żądanie ustawienia lokalizacji ... nie może być honorowane

#parameter settings 
sometext <- "Mon, 14 Mar 2011 23:42:16 GMT" 
timeFormat <- "%a, %d %b %Y %H:%M:%S" 
timeZone <- "GMT" 
#get current locale 
loc <- Sys.getlocale("LC_TIME") 
#set british localization 
dummy <- Sys.setlocale("LC_TIME", "en_GB.UTF-8") 
#parse datetime string 
time <- strptime(sometext, format = timeFormat, tz= timeZone) 
#set local back 
dummy <- Sys.setlocale("LC_TIME", loc) 

Niestety, mój kolega dostaje następujące ostrzeżenie przy korzystaniu z tej funkcji:

In Sys.setlocale("LC_TIME", "en_GB.UTF-8") : 
OS reports request to set locale to "en_GB.UTF-8" cannot be honored 

na moim komputerze wszystko działa poprawnie. Czy jest lepsza (i niezależna od zainstalowanej lokalizacji R) sposób wykonania tego zadania? Generalnie chciałbym użyć strptime, ponieważ pozwala on na bardzo elastyczny sposób analizowania łańcuchów datetime.

Odpowiedz

8

Jestem całkowicie pewien, że ustawienie "en_GB.UTF-8" nie jest zainstalowane na komputerze twojej uczelni. Najłatwiej można go zainstalować :) Cóż, nie jest to banalne z każdym systemem operacyjnym.

Inną opcją może być użycie standardowych ustawień regionalnych, które można znaleźć na każdym komputerze. Ponieważ twój przykład nie pokazuje żadnego specjalnego formatu, możesz spróbować ustawić LC_TIME na C, który działa również pod Linuksem i Windows. Dzięki temu lokalowi Twój przykład zadziała jak urok. Zobacz:

> Sys.setlocale("LC_TIME", "C") 
> strptime("Mon, 14 Mar 2011 23:42:16 GMT", format = "%a, %d %b %Y %H:%M:%S", tz="GMT") 
[1] "2011-03-14 23:42:16 GMT" 

Albo inaczej należy przekształcić swoje dane - np .: napisać krótki funkcji zastąpił wymienić wszystkich tygodniowych i miesiącach standardowych strun i zrestrukturyzować swoje struny importowane do standardowych.

+0

Edytowałem pytanie z przykładem czegoś i timeformatu. ponieważ instalacja lokalizacji nie zależy od systemu operacyjnego, inna opcja byłaby miła ... – user625626

+0

@ user625626: dziękuję za aktualizację, a także za zwrócenie na nią uwagi. Poprawiłem odpowiedź i mam nadzieję, że to może pomóc. – daroczig

+0

jep - działa na systemie Linux i Windows - dziękuję bardzo! – user625626

1

Próbowałem Twojego kodu na moim komputerze z systemem Windows i otrzymałem ten sam błąd. Dla porównania, wyniki Sys.getlocale („LC_TIME”):

> Sys.getlocale("LC_TIME") 
[1] "English_United Kingdom.1252" 

Podejrzewam, że to może być dość standardowe ustawienia regionalne.

Podejrzewam jednak, że lepszym sposobem rozwiązania tego problemu jest użycie niektórych funkcji w pakiecie lubridate, co ułatwia pracę z datami.

Nie podajesz wystarczająco dużo szczegółów na swoje pytanie, co zamierzasz zrobić, ale domyślam się, że "coś" ma konkretny oczekiwany format, taki jak DMY lub YMD. Lubridate udostępnia funkcje do analizowania dat w dowolnym określonym formacie, np. dmy(), ymd(), mdy() - dostajesz obraz.

Jeśli podasz więcej szczegółów na temat swojego prawdziwego problemu, być może będziemy mogli dokładniej Ci pomóc.

+0

Przepraszam, zredagowałem moje pytanie z przykładem czegoś i timeformat. Przyjrzę się smarowaniu, dziękuję za cynk! – user625626

+0

Niestety smaruje również używa strptime w jego funkcji parse_date - więc nie ma pomocy z tamtej strony :-( – user625626