Включение формата даты во фрейм данных

#r #date

#r #Дата

Вопрос:

как я могу преобразовать фрейм данных в формат месяца / дня / года?

Я использую следующий код для создания нового столбца в моем фрейме данных, чтобы он содержал даты каждой строки из метаданных.

meta.df.61.69$date = data.frame(date = str_extract(meta.df.61.69$Title,"\d{1,2} \w* \d{4}"))

Когда я запускаю приведенный выше код, R возвращает мне следующее, как видно из первой строки на рисунке: 17 ИЮНЯ 1961 года

По сути, как я могу преобразовать его в формат месяца / дня / года? Что-то вроде этого: 17.06.1961 вместо 17 ИЮНЯ 1961 года.Спасибо!

Возвращение dput(head(meta.df.61.69$date)) ис structure(list(date = c("17 JUNE 1961", "19 JUNE 1961", "20 JUNE 1961", "21 JUNE 1961", "22 JUNE 1961", "23 JUNE 1961")), row.names = c(NA, 6L), class = "data.frame")

Прилагается скриншот моего фрейма данных:введите описание изображения здесь

Ответ №1:

Класс Date [as.Date()] имеет параметры для указания формата даты. Хотя я обычно предпочитаю, чтобы формат, который у вас есть, был однозначным, ваш желаемый формат будет указан:

 format="%m/%d/%Y"
 

В гугле есть множество примеров и руководств.

Ответ №2:

Попробуй это:

 library(lubridate)
library(stringr)

as.Date(str_to_title("17 JUNE 1961"),"%d %B %Y")
 

Или в вашем случае:

 library(lubridate)
library(stringr)

meta.df.61.69$date <- as.Date(str_to_title(meta.df.61.69$date),"%d %B %Y")
 

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

1. Привет @Marcos, спасибо за ваш ответ. meta.df.61.69$date <- as.Date(str_to_title(meta.df.61.69$date),"%d %B %Y") Однако, когда я запускаю код, R возвращает мне только значения NA в столбце даты и следующее сообщение: «В stri_trans_totitle(строка, opts_brkiter = stri_opts_brkiter(locale = locale)) : аргумент не является атомарным вектором; принудительный». Что вы могли бы порекомендовать ?

2. Если вы можете запустить предложенный код без ошибок, но получаете ошибку при использовании ваших данных, то это поможет поделиться примером ваших данных воспроизводимым способом (не в виде скриншота). Например, вы могли бы включить в свой вопрос вывод dput(head(meta.df.61.69$date.date)) , который создаст объект данных, точно воссоздающий первые шесть строк вашего столбца.

3. привет, @JonSpring, результат structure(list(date = c("17 JUNE 1961", "19 JUNE 1961", "20 JUNE 1961", "21 JUNE 1961", "22 JUNE 1961", "23 JUNE 1961")), row.names = c(NA, 6L), class = "data.frame")

4. Я действительно не понимаю, что произошло. I работает идеально для меня: x <- structure(list(date = c("17 JUNE 1961", "19 JUNE 1961", "20 JUNE 1961", "21 JUNE 1961", "22 JUNE 1961", "23 JUNE 1961")), row.names = c(NA, 6L), class = "data.frame") library(lubridate) library(stringr) Sys.setlocale("LC_ALL","English") x$date <- as.Date(str_to_title(x$date),"%d %B %Y")

Ответ №3:

 # Sample Data
# Edit: was previously 
# my_data <- structure(....
meta.df.61.69 <- structure(list(date.date = c("17 JUNE 1961", "19 JUNE 1961", "20 JUNE 1961",  "21 JUNE 1961", "22 JUNE 1961", "23 JUNE 1961")), row.names = c(NA,  6L), class = "data.frame")


# Calculation assuming meta.df.61.69 is a data frame you have
meta.df.61.69$date_ISO8601 = lubridate::dmy(meta.df.61.69$date.date)
meta.df.61.69$date_formatted = format(meta.df.61.69$date_ISO8601 , "%m/%d/%Y")

> meta.df.61.69
          date date_ISO8601 date_formatted
1 17 JUNE 1961   1961-06-17     06/17/1961
2 19 JUNE 1961   1961-06-19     06/19/1961
3 20 JUNE 1961   1961-06-20     06/20/1961
4 21 JUNE 1961   1961-06-21     06/21/1961
5 22 JUNE 1961   1961-06-22     06/22/1961
6 23 JUNE 1961   1961-06-23     06/23/1961
 

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

1. Спасибо @JonSpring, но как я могу это сделать, не выбирая даты вручную? Например, без необходимости писать c («17 ИЮНЯ 1961 года») и т. Д. Мои данные охватывают период с 1961 по 1978 год, поэтому я не могу сделать это вручную 🙁

2. Для простоты я изначально назвал свою демонстрационную таблицу ввода my_data , но она должна была продемонстрировать, с чем вы хотите работать meta.df.61.69 . Я переименовал таблицу в моем примере, чтобы было ясно, что это должно работать и с вашей таблицей, при условии, что остальные данные имеют согласованную форму.

3. У меня все еще возникают ошибки @JonSpring. Я расскажу вам шаг за шагом, сначала я запускаю код meta.df.61.69$date = data.frame(date = str_extract(meta.df.61.69$Title,"\d{1,2} \w* \d{4}")) , который выдает мне формат даты, который я хочу изменить. Затем я запускаю код, который вы мне предоставили: meta.df.61.69$date_ISO8601 = lubridate::dmy(meta.df.61.69$date) однако я получаю следующее сообщение: «Не удалось проанализировать все форматы. Форматы не найдены.» Что мне делать? Obs: meta.df.61.69 — это фрейм данных, который у меня есть

4. Отредактировано для вызова столбца примера извлеченных данных date.date , подобного вашему исходному сообщению, помогает ли это?

5. отображается следующее сообщение: Error in `$<-.data.frame`(`*tmp*`, date_ISO8601, value = numeric(0)) : replacement has 0 rows, data has 2484