Split given timestamp into year month day period format - r

I am writing a R code and I have a problem to split Date format into year, month, day, hour format.
I have dataframe named Metadata has a column X_date, contains timestamp like '01.01.2020 00:00:00', '01.01.2020 01:00:00' and so on.
I want to change this x_date column into additional four columns namely year, month, day and hour. I tried this way using some previous answer:
Metadata$Date <- as.Date(Metadata$X_date)
Metadata$Time <- format(as.POSIXct(Metadata$X_date) ,format = "%Y:%m:%d %H")
It gave me this error:
Error in as.POSIXlt.character(as.character(x), ...) :
character string is not in a standard unambiguous format
I am very new to R programming. Please help me. Thnak you for your time.

The format specified should match the order in which all the components of 'Date/Time' occurs in the original vector. Assuming that 'day' is first, followed by 'month', the coversion in 'POSIXct' would be
as.POSIXct(Metadata$X_date, format = "%d.%m.%Y %H:%M:%S")
As we want to create new columns, this can be done with tidyverse
library(tidyverse)
library(lubridate)
Metadata %>%
mutate(X_date = dmy_hms(X_date),
year = year(X_date),
month = month(X_date),
day = day(X_date),
hour = hour(X_date))

Related

R: Converting a string to useful date and time values

I have a csv file with a column values like "20140929120000" which gives the date and time.
After importing it to R, I want to format this as a date variable while keeping the time part as well(if that is possible).
So, the output should be a date variable '2014-09-29'.
How would I get the time part as a separate column with value "12:00:00"?
how about
install.packages('lubridate')
library(lubridate)
y <- as.numeric(20140929120000)
df %>%
mutate(Date = as.Date(ymd_hms(y), tz= Sys.timezone()),
Time = format(lubridate::ymd_hms(y), "%H:%M:%S")
just change the Y in the mutate to your date column
We can use the POSIXct type here:
val <- "20140929120000"
mask <- "%Y%m%d%H%M%S"
as.POSIXct(strptime(val, mask))
[1] "2014-09-29 12:00:00 UTC"
To see the various components of the timestamp, try:
unclass(strptime(val, mask))

How Can I Create a New Column 'Month' From a YYYY-MM-DD HH:MM:SS Format Using Lubridate?

I am trying to create a new column of just the month from the following format using lubridate:
2020-01-01 00:00:00
yyyy-mm-dd hh:mm:ss
Thank you in advance.
My table is titled 'weather4' and thus far I have the following:
> weather4 %>%
+ mutate(Year = year(weather4$valid),
+ Month = month(weather4$valid),
+ Day = day(weather4$valid))
image of output generated
Original Data
weather4$valid is full of NAs in your sample. Does it have any valid data?
I doubt you need year(weather4$valid) you are piping weather4 to it so just year(valid) is all you usually need...
Assuming valid has a date in it?
Now if it does... It also thinks it is a character judging by the table so you need to change it to a "date" or date-time.
So I would suggest:
year(as.Posixtct(valid, format = "%Y-%m-%d %H:%M:%S"))
You might want to do that once and pipe the result...

Unable to convert YY-mm generated by zoo package , to Date format in R

I have a Date column (e.g. 1985-01) which I generated by combining two different columns with zoo package (month and year) as follow : my_data$Date<-as.Date(as.yearmon(paste(my_data$year, my_data$month), "%Y %m")).
From this, I get the column I want but class(my_data$Date) gives me "factor".
I have tried the following in order to convert it to Date format (because I want to display on year on my ggplot axis) but with no success.
as.Date(t$Date,format="%y-%m")
or
as.Date(t$Date, format = "%Y-%m")
or
format(as.Date(my_data$Date, format="%Y-%m"))
or
transform(my_data, Date = as.Date(Date))
I would really appreciate any help.

How to add month to a date in european format in r?

I have a dataframe that looks like this:
Date Time RH
29.03.2017 09:00:00 53.44
with many observations. I want to add a new column to my dataframe which shows the month of the date (ex: 20.03.2017 March) for the entire year. My dataframe goes from 29.03.2017 til 01.01.2018. I have tried it for a couple hours now and nothing seems to work, please help.
Convert your "Date" column into a date object using as.Date()
df$Date <- as.Date(df$Date, format = "%d.%m.%Y")
Then you can use format to extract the month such as:
df$month <- format(df$Date, format = "%b")
Alternatively you can use the Lubridate package
library(lubridate)
df$month <- month(df$Date, label = TRUE)

objct Timestamp not found when sort_by [duplicate]

I need to sort a data frame by date in R. The dates are all in the form of "dd/mm/yyyy". The dates are in the 3rd column. The column header is V3. I have seen how to sort a data frame by column and I have seen how to convert the string into a date value. I can't combine the two in order to sort the data frame by date.
Assuming your data frame is named d,
d[order(as.Date(d$V3, format="%d/%m/%Y")),]
Read my blog post, Sorting a data frame by the contents of a column, if that doesn't make sense.
Nowadays, it is the most efficient and comfortable to use lubridate and dplyr libraries.
lubridate contains a number of functions that make parsing dates into POSIXct or Date objects easy. Here we use dmy which automatically parses dates in Day, Month, Year formats. Once your data is in a date format, you can sort it with dplyr::arrange (or any other ordering function) as desired:
d$V3 <- lubridate::dmy(d$V3)
dplyr::arrange(d, V3)
In case you want to sort dates with descending order the minus sign doesn't work with Dates.
out <- DF[rev(order(as.Date(DF$end))),]
However you can have the same effect with a general purpose function: rev(). Therefore, you mix rev and order like:
#init data
DF <- data.frame(ID=c('ID3', 'ID2','ID1'), end=c('4/1/09 12:00', '6/1/10 14:20', '1/1/11 11:10')
#change order
out <- DF[rev(order(as.Date(DF$end))),]
Hope it helped.
You can use order() to sort date data.
# Sort date ascending order
d[order(as.Date(d$V3, format = "%d/%m/%Y")),]
# Sort date descending order
d[rev(order(as.Date(d$V3, format = "%d/%m/%y"))),]
Hope this helps,
Link to my quora answer https://qr.ae/TWngCe
Thanks
If you just want to rearrange dates from oldest to newest in r etc. you can always do:
dataframe <- dataframe[nrow(dataframe):1,]
It's saved me exporting in and out from excel just for sort on Yahoo Finance data.
The only way I found to work with hours, through an US format in source (mm-dd-yyyy HH-MM-SS PM/AM)...
df_dataSet$time <- as.POSIXct( df_dataSet$time , format = "%m/%d/%Y %I:%M:%S %p" , tz = "GMT")
class(df_dataSet$time)
df_dataSet <- df_dataSet[do.call(order, df_dataSet), ]
You could also use arrange from the dplyr library.
The following snippet will modify your original date string to a date object, and order by it. This is a good approach, as you store a date as a date, not just a string of characters.
dates <- dates %>%
mutate(date = as.Date(date, "%d/%m/%Y")) %>%
arrange(date)
If you just want to order by the string (usually an inferior option), you can do this:
dates <- dates %>%
arrange(date = as.Date(date, "%d/%m/%Y"))
If you have a dataset named daily_data:
daily_data <- daily_data[order(as.Date(daily_data$date, format="%d/%m/%Y")),]

Resources