Hi, I'm newish to R, a recent convert from Matlab... So far I'm impressed, and determined to solve the following problem, which seems like it should be easy: I have a long (millions of points) data series recorded with a datalogger that produced a timestamp in 4 columns: Year, Day of Year, Time in (H)HMM and Seconds. I would like to have R interpret these columns as a time object and have made some progress (e.g., using paste() to create a single column and then strptime() to interpret -- is that too roundabout??), but one thing is throwing me off and I can't seem to conquer it. The hour-minute column in the raw data has no colon, so noon looks like "1200". Morning times have only 3 characters and afternoon times have 4. I've been playing around with a fake set of times: times <- c(110, 230, 459, 1001, 1238, 1922) When I use strptime(data, "%k%M") the last three are interpreted fine but the first three are messed up because, for some reason, (even though I use %k for hour format?) the first two characters are assumed to be hour and the remaining one is minutes. For times[3] I get NA because R doesn't know what to do with 45 hours... [1] "2010-06-03 11:00:00" "2010-06-03 23:00:00" NA [4] "2010-06-03 10:01:00" "2010-06-03 12:38:00" "2010-06-03 19:22:00" Fair enough, so I tried a different angle, using an if...else statement: hours <- if(nchar(times)>3) strtrim(times,2) else strtrim(times,1) This worked great when times was only a vector of length=1, but when I try to apply it to something larger, I get the following warning: Warning message: In if(nchar(times)>3) strtrim(times,2) else strtrim(times,1) : the condition has length > 1 and only the first element will be used and the output hours are only the first character. Not entirely sure if I understand this. Any advice on how to do this? Are there packages or commands that I'm not aware of that know how to deal with (h)hmm times? Thanks much, -Pete --------------------------------------------- platform i486-pc-linux-gnu arch i486 os linux-gnu system i486, linux-gnu status major 2 minor 10.1 year 2009 month 12 day 14 svn rev 50720 language R version.string R version 2.10.1 (2009-12-14) -- Pete Moore Postdoctoral Research Associate Dept. Geological & Atmospheric Sciences Iowa State University [[alternative HTML version deleted]]
?ifelse> t2 <- ifelse(nchar(times)<4, paste(" ", times, sep=""), times) > strptime(t2, "%H%M")Nikhil On Thu, Jun 3, 2010 at 5:21 PM, Peter Moore <pmoore@iastate.edu> wrote:> Hi, > I'm newish to R, a recent convert from Matlab... So far I'm impressed, and > determined to solve the following problem, which seems like it should be > easy: > I have a long (millions of points) data series recorded with a datalogger > that produced a timestamp in 4 columns: Year, Day of Year, Time in (H)HMM > and Seconds. I would like to have R interpret these columns as a time > object and have made some progress (e.g., using paste() to create a single > column and then strptime() to interpret -- is that too roundabout??), but > one thing is throwing me off and I can't seem to conquer it. The > hour-minute column in the raw data has no colon, so noon looks like "1200". > Morning times have only 3 characters and afternoon times have 4. I've been > playing around with a fake set of times: > times <- c(110, 230, 459, 1001, 1238, 1922) > > When I use > strptime(data, "%k%M") > the last three are interpreted fine but the first three are messed up > because, for some reason, (even though I use %k for hour format?) the first > two characters are assumed to be hour and the remaining one is minutes. > For > times[3] I get NA because R doesn't know what to do with 45 hours... > [1] "2010-06-03 11:00:00" "2010-06-03 23:00:00" NA > [4] "2010-06-03 10:01:00" "2010-06-03 12:38:00" "2010-06-03 19:22:00" > > Fair enough, so I tried a different angle, using an if...else statement: > hours <- if(nchar(times)>3) strtrim(times,2) else strtrim(times,1) > > This worked great when times was only a vector of length=1, but when I try > to apply it to something larger, I get the following warning: > Warning message: > In if(nchar(times)>3) strtrim(times,2) else strtrim(times,1) : > the condition has length > 1 and only the first element will be used > and the output hours are only the first character. Not entirely sure if I > understand this. > > Any advice on how to do this? Are there packages or commands that I'm not > aware of that know how to deal with (h)hmm times? > > Thanks much, > -Pete > --------------------------------------------- > platform i486-pc-linux-gnu > arch i486 > os linux-gnu > system i486, linux-gnu > status > major 2 > minor 10.1 > year 2009 > month 12 > day 14 > svn rev 50720 > language R > version.string R version 2.10.1 (2009-12-14) > > -- > Pete Moore > Postdoctoral Research Associate > Dept. Geological & Atmospheric Sciences > Iowa State University > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >[[alternative HTML version deleted]]
Minor correction below. Use 0 instead of space if you are using %H On Thu, Jun 3, 2010 at 8:55 PM, nikhil kaza <nikhil.list@gmail.com> wrote:> ?ifelse > > > t2 <- ifelse(nchar(times)<4, paste("0", times, sep=""), times) > > > strptime(t2, "%H%M") > > Nikhil > > > > On Thu, Jun 3, 2010 at 5:21 PM, Peter Moore <pmoore@iastate.edu> wrote: > >> Hi, >> I'm newish to R, a recent convert from Matlab... So far I'm impressed, and >> determined to solve the following problem, which seems like it should be >> easy: >> I have a long (millions of points) data series recorded with a datalogger >> that produced a timestamp in 4 columns: Year, Day of Year, Time in (H)HMM >> and Seconds. I would like to have R interpret these columns as a time >> object and have made some progress (e.g., using paste() to create a single >> column and then strptime() to interpret -- is that too roundabout??), but >> one thing is throwing me off and I can't seem to conquer it. The >> hour-minute column in the raw data has no colon, so noon looks like >> "1200". >> Morning times have only 3 characters and afternoon times have 4. I've >> been >> playing around with a fake set of times: >> times <- c(110, 230, 459, 1001, 1238, 1922) >> >> When I use >> strptime(data, "%k%M") >> the last three are interpreted fine but the first three are messed up >> because, for some reason, (even though I use %k for hour format?) the >> first >> two characters are assumed to be hour and the remaining one is minutes. >> For >> times[3] I get NA because R doesn't know what to do with 45 hours... >> [1] "2010-06-03 11:00:00" "2010-06-03 23:00:00" NA >> [4] "2010-06-03 10:01:00" "2010-06-03 12:38:00" "2010-06-03 19:22:00" >> >> Fair enough, so I tried a different angle, using an if...else statement: >> hours <- if(nchar(times)>3) strtrim(times,2) else strtrim(times,1) >> >> This worked great when times was only a vector of length=1, but when I try >> to apply it to something larger, I get the following warning: >> Warning message: >> In if(nchar(times)>3) strtrim(times,2) else strtrim(times,1) : >> the condition has length > 1 and only the first element will be used >> and the output hours are only the first character. Not entirely sure if I >> understand this. >> >> Any advice on how to do this? Are there packages or commands that I'm not >> aware of that know how to deal with (h)hmm times? >> >> Thanks much, >> -Pete >> --------------------------------------------- >> platform i486-pc-linux-gnu >> arch i486 >> os linux-gnu >> system i486, linux-gnu >> status >> major 2 >> minor 10.1 >> year 2009 >> month 12 >> day 14 >> svn rev 50720 >> language R >> version.string R version 2.10.1 (2009-12-14) >> >> -- >> Pete Moore >> Postdoctoral Research Associate >> Dept. Geological & Atmospheric Sciences >> Iowa State University >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help@r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide >> http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. >> > >[[alternative HTML version deleted]]
> -----Original Message----- > From: r-help-bounces at r-project.org > [mailto:r-help-bounces at r-project.org] On Behalf Of Peter Moore > Sent: Thursday, June 03, 2010 2:22 PM > To: r-help at r-project.org > Subject: [R] reformat time from hhmm > > Hi, > I'm newish to R, a recent convert from Matlab... So far I'm > impressed, and > determined to solve the following problem, which seems like > it should be > easy: > I have a long (millions of points) data series recorded with > a datalogger > that produced a timestamp in 4 columns: Year, Day of Year, > Time in (H)HMM > and Seconds. I would like to have R interpret these columns as a time > object and have made some progress (e.g., using paste() to > create a single > column and then strptime() to interpret -- is that too > roundabout??), but > one thing is throwing me off and I can't seem to conquer it. The > hour-minute column in the raw data has no colon, so noon > looks like "1200". > Morning times have only 3 characters and afternoon times have > 4. I've been > playing around with a fake set of times: > times <- c(110, 230, 459, 1001, 1238, 1922) > > When I use > strptime(data, "%k%M"You must have done this with 'times', not 'data'. strptime's first argument should be character data, not numeric and the default conversion of numeric to character changes 110->"110", not "0110". I like to use sprintf() (with its C syntax) to control the conversion:> strptime(sprintf("%04d", times), "%k%M")[1] "2010-06-03 01:10:00" "2010-06-03 02:30:00" "2010-06-03 04:59:00" "2010-06-03 10:01:00" "2010-06-03 12:38:00" [6] "2010-06-03 19:22:00" You could put the year-month-day part into the sprintf's format argument as well if you don't want it to use today's date for that. Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com> the last three are interpreted fine but the first three are messed up > because, for some reason, (even though I use %k for hour > format?) the first > two characters are assumed to be hour and the remaining one > is minutes. For > times[3] I get NA because R doesn't know what to do with 45 hours... > [1] "2010-06-03 11:00:00" "2010-06-03 23:00:00" NA > [4] "2010-06-03 10:01:00" "2010-06-03 12:38:00" > "2010-06-03 19:22:00" > > Fair enough, so I tried a different angle, using an if...else > statement: > hours <- if(nchar(times)>3) strtrim(times,2) else strtrim(times,1) > > This worked great when times was only a vector of length=1, > but when I try > to apply it to something larger, I get the following warning: > Warning message: > In if(nchar(times)>3) strtrim(times,2) else strtrim(times,1) : > the condition has length > 1 and only the first element > will be used > and the output hours are only the first character. Not > entirely sure if I > understand this. > > Any advice on how to do this? Are there packages or commands > that I'm not > aware of that know how to deal with (h)hmm times? > > Thanks much, > -Pete > --------------------------------------------- > platform i486-pc-linux-gnu > arch i486 > os linux-gnu > system i486, linux-gnu > status > major 2 > minor 10.1 > year 2009 > month 12 > day 14 > svn rev 50720 > language R > version.string R version 2.10.1 (2009-12-14) > > -- > Pete Moore > Postdoctoral Research Associate > Dept. Geological & Atmospheric Sciences > Iowa State University > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >