2011-02-01 18 views
7

Mam zestaw danych, który koduje datę-czas na dwie oddzielne zmienne. Zwykle po prostu wklejałem je do wnętrza as.POSIXct i kontynuowałem. Jednak data jest podana w postaci ciągu znaków, a pora dnia jako ułamek 24 godzin - np. 12 wieczorem to 0,5, 9:30 to 0,1458333, itp.Konwertuj ułamek dnia na czas POSIX w R

Nie wydaje się to takie trudne do przeliczenia ułamkowe dni w godzinach zegarowych, ale wolałbym użyć wcześniej istniejącej funkcji, jeśli to możliwe. Czy coś takiego istnieje w bazie R? Paczka?

Jeśli jest to jakiekolwiek użycie, jest to pole czasu Excel (xlsx) importowane do R za pomocą RODBC.

EDYTUJ Co dziwne, po ponownym przeanalizowaniu tego problemu, godziny są teraz odczytywane jako POSIXct. Nie wiem, co z tym zrobić.

+0

Haha. To brzmi jak moje doświadczenie czytając plik xls. Pewnego dnia piszę kod R, aby przekonwertować z numerycznej daty Excela, a następnie tydzień później edytuję xls z nowymi danymi, a kiedy przeczytam w R, daty są tekstem. Możesz rozwiązać problem z formatowaniem komórek w programie Excel, aby to naprawić. –

+0

Jeśli zastosujesz format cutom do czasu w Excelu, wartości, które przychodzą do plików tekstowych csv, będą zgodne z tym formatem. Proponuję albo "yyyy-mm-dd hh: mm: ss AM/PM" lub "rrrr-mm-dd gg: mm: ss". Nie skonfigurowałem RODBC, więc nie mogę przetestować, czy może to wpłynąć na transfer DB. –

Odpowiedz

5

wartości POSIXct są po prostu liczba sekund od północy czasu GMT 1970-01-01. (Musisz więc zwrócić uwagę na swoje przesunięcie względem UTC.) Możesz użyć części daty i dodać liczbę dni 24 * 3600 (jako wartość (dtval) do wartości czasu * 24 * 3600. Gabor wskazał na artykuł w R News (który napisał, dziękuję, Gabor.)

Nie podałeś przykładu ciągu znaków. Jeśli otrzymujesz datę jako ciąg znaków, to jako wartość.Date (strDate) konwertuje zmienna "strDate" na klasę Date, jeśli jest w formacie "RRRR-MM-DD" lub "RRRR/MM/DD", w przeciwnym razie kody formatowania znajdują się na stronie ".Name"

Po uzyskaniu POSIXct- Klasyfikujemy zmienną po prostu dodajemy liczbę sekund.W tym przykładzie dodajemy 30 minut do północy dzisiaj 1 lutego 2011 (w mojej strefie czasowej, która jest UTC-5):

> as.POSIXct(as.Date("2011-02-01")) +30*60 
[1] "2011-01-31 19:30:00 EST" 

I to jest Twój czas wartość dodana do północy mojego czasu:

> as.POSIXct(as.Date("2011-02-01 00:00", tzone="UTC"))+3600*5 + 3600*24*timeval 
[1] "2011-02-01 03:29:59 EST" 
+0

Nie rozumiem tego. Co to jest 'timeval' w drugim bloku kodu? –

+0

Jest to nazwa, której przypisujesz tę wartość od 0.1458333 do. Powiel go przez liczbę sekund w ciągu dnia. –

+0

Dzięki. Użyłem tego pomysłu do wykonania operacji odwrotnej: Zmiana czasów posixCT na ułamkowe dni z: (timeval-as.POSIXct (...))/86400. Było to bardzo przydatne przy analizie szeregów czasowych w innych bazach czasu niż w Hz, takich jak cykle dziennie. –

6

R News 4/1 Help Desk artykuł ma sekcję na czytanie dat Excel w R.

+0

p. 30, konkretnie –