R конвертировать yy-mm строку в формат даты [дубликат]

Один параметр для конкатенации строковых столбцов в Spark Scala использует concat.

Нужно проверить нулевые значения. Потому что, если один из столбцов имеет значение NULL, результат будет нулевым, даже если один из столбцов имеет информацию.

Используя concat и withColumn:

val newDf = df.withColumn("NEW_COLUMN", concat(when(col("COL1").isNotNull,col("COL1")).otherwise(lit("null"), when(col("COL2").isNotNull,col("COL2")).otherwise(lit("null")))

Используя concat и select:

val newDf = df.selectExpr("concat(nvl(COL1, ''), nvl(COL2, '')) as NEW_COLUMN")

В обоих подходах вы будете иметь NEW_COLUMN, значение которого представляет собой конкатенацию столбцов: COL1 и COL2 из вашего исходного df.

2
задан RichS 19 May 2016 в 03:40
поделиться

3 ответа

Если переменная Date является фактическим вектором класса yearmon, из пакета zoo метод as.Date.yearmon может делать то, что вы хотите, через свой аргумент frac.

Используя ваши данные , и предположив, что Date был первоначально символьным вектором

library("zoo")
df <- data.frame(Date = c("2014-07", "2014-08", "2014-09"),
                 Arrivals = c(100, 150, 200))

, я преобразую это в вектор yearmon:

df <- transform(df, Date2 = as.yearmon(Date))

Предполагая, что это то, что у вас есть, то вы можете достичь того, что хотите, используя as.Date() с frac = 1:

df <- transform(df, Date3 = as.Date(Date2, frac = 1))

, который дает:

> df
     Date Arrivals    Date2      Date3
1 2014-07      100 Jul 2014 2014-07-31
2 2014-08      150 Aug 2014 2014-08-31
3 2014-09      200 Sep 2014 2014-09-30

Это показывает отдельные шаги. Если вы хотите, чтобы конечный Date был однострочным

## assuming `Date` is a `yearmon` object
df <- transform(df, Date = as.Date(Date, frac = 1))
## or if not a `yearmon`
df <- transform(df, Date = as.Date(as.yearmon(Date), frac = 1))

Аргумент frac во фракции месяца, чтобы назначить результирующие даты при преобразовании из объектов yearmon в Date объектов. Следовательно, чтобы получить первый день месяца, а не конвертировать в символ и вставить на "-01", как показал ваш вопрос, лучше принудить Date объект к frac = 0.

Если Date в вашем df не является объектом класса yearmon, тогда вы можете решить свою проблему, переведя его в один, а затем используя метод as.Date(), как описано выше.

8
ответ дан Gavin Simpson 24 August 2018 в 22:45
поделиться

Используя lubridate, вы можете добавить месяц и вычесть день, чтобы получить последний день месяца:

library(lubridate)

ymd(paste0(df$Date, '-01')) + months(1) - days(1)
# [1] "2014-07-31" "2014-08-31" "2014-09-30"
3
ответ дан alistaire 24 August 2018 в 22:45
поделиться

Вот способ сделать это, используя пакет zoo.

R-код:

library(zoo)
df
#      Date Arrivals
# 1 2014-07      100
# 2 2014-08      150
# 3 2014-09      200

df$Date <- as.Date(as.yearmon(df$Date), frac = 1)

# output
#         Date Arrivals
# 1 2014-07-31      100
# 2 2014-08-31      150
# 3 2014-09-30      200
4
ответ дан Manohar Swamynathan 24 August 2018 в 22:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: