Витяг року з дати


82

Як я можу видалити перші елементи зі змінної, особливо якщо ця змінна має спеціальні символи. Наприклад, у мене є такий стовпець:

Date
01/01/2009
01/01/2010
01/01/2011
01/01/2012

Мені потрібно створити новий стовпець, наведений нижче:

Date
2009
2010
2011
2012

13
Перетворити на клас «Дата» та використати formatдля вилучення «року»
Акрун,

5
абоgsub(".*/","",df$Date)
mtoto

2
абоsubstr(as.character(....), 7, 10)
jogo

6
lubridate::yearтакож повинен зробити фокус, як тільки дані будуть у форматі "Дата", як запропонував @akrun.
fdetsch

6
Найбільш чисте рішення - примусити цю змінну до Dateі використовувати одну formatабо інші функції для вилучення частин її. Наприклад, x <- as.Date("01/01/2009", format = "%m/%d/%Y"); lubridate::year(x).
Роман Луштрік,

Відповіді:


20

якщо всі ваші дати однакової ширини, ви можете помістити дати у вектор і скористатися підрядком

Date
a <- c("01/01/2009", "01/01/2010" , "01/01/2011")
substring(a,7,10) #This takes string and only keeps the characters beginning in position 7 to position 10

вихід

[1] "2009" "2010" "2011"

Я згоден, але ви можете легко перетворити це на числовий вектор, ні? as.numeric(substring(a,7,10))
Фабіан Хаберсак,

3
Дати не слід перетворювати на рядки або числа; вони за своєю суттю є "кількістю х (секунд) з моменту фіксованої точки часу" і відображаються як зручні для читання рядки - строго не підлягають маніпулюванню ними як рядки.
skoh

178

Як обговорювалось у коментарях, цього можна досягти, перетворивши запис у Dateформат та витягнувши рік, наприклад так:

format(as.Date(df1$Date, format="%d/%m/%Y"),"%Y")

7
Чому, блін, це працює? Якщо я переглядаю format()документацію, то про другий аргумент, який ви надали, нічого не сказано. Як я повинен це розуміти?
scarface

16
From ?format: "формат - це загальна функція . Окрім описаних тут методів, існують методи для дат ( див. Format.Date )". From ?format.Date: "Метод ## S3 для формату класу" Дата "(x, ...) [де ... позначає] подальші аргументи, що передаються від або до інших методів, включаючи формат для методів as.character та as.Date . ". Див. Також перший приклад у ?format.Date.
RHertel


27

Коли ви перетворюєте свою змінну в Date:

date <-  as.Date('10/30/2018','%m/%d/%Y')

потім можна вирізати потрібні елементи та створити нові змінні, наприклад рік:

year <- as.numeric(format(date,'%Y'))

або місяць:

month <- as.numeric(format(date,'%m'))

4

Якщо ви використовуєте dateпакет , це можна зробити досить просто.

library(date)
Date <- c("01/01/2009", "01/01/2010", "01/01/2011", "01/01/2012")
Date <- as.date(Date)
Date
# [1] 1Jan2009 1Jan2010 1Jan2011 1Jan2012
date.mdy(Date)$year
# [1] 2009 2010 2011 2012

## be aware that these are now integers and thus different methods may be invoked:
str(date.mdy(Date)$year)
# int [1:4] 2009 2010 2011 2012
summary(Date)
#     First      Last   
# "1Jan2009" "1Jan2012" 
summary(date.mdy(Date)$year)
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#    2009    2010    2010    2010    2011    2012 

3

Це більше поради, ніж конкретна відповідь, але моя пропозиція полягає в тому, щоб негайно перетворити дати на змінні дати, а не зберігати їх як рядки. Таким чином, ви можете використовувати на них функції дати (і часу), а не намагатися використовувати дуже клопітні обхідні шляхи.

Як зазначалося, пакет з мастилом має приємні функції витяжки.

Для деяких проектів я виявив, що дати складання з самого початку корисні: для початку створіть змінні рік, місяць, день (місяця) та день (тижня). Це може спростити резюме, таблиці та графіки, оскільки код вилучення є окремим від коду зведення / таблиці / графіку, і тому, що якщо вам потрібно його змінити, вам не доведеться розгортати ці зміни у декількох місцях.


0

В даний час ви також можете покладатися лише на data.tableпакет та його IDateклас, а також пов’язані функції (Перевірка ?as.IDate()). Отже, не потрібно додатково встановлювати lubridate.

require(data.table)

a <- c("01/01/2009", "01/01/2010" , "01/01/2011")
year(as.IDate(a, '%d/%m/%Y')) # all data.table functions
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.