统计数据类型和日期时间数据

本章介绍统计数据的计量尺度(定类、定序、定距、定比),重点介绍了一种特殊的数据类型:时间和日期。并讲解了一些常用时间日期函数:strptime as.Date ,除此之外还介绍了时间 Times 类型的两种类型 POSIXctPOSIXlt

代码和笔记存储在 GitHub 库 【持续更新中,建议 star!】

1 统计数据的计量尺度

统计数据的四种计量尺度:

  • 定类尺度
  • 定序尺度
  • 定距尺度
  • 定比尺度

1.1 定类尺度

概念:又称列名尺度或类别尺度,是按照研究对象的某种属性将其划分为若干组或类的一种测度。

举例:性别 、籍贯、民族等

特征

  1. 只能区分事物的类别,无法比较优劣或大小,
  2. 对应变量:名义变量,比如用 X 表示性别
  3. 文字,数值(标签):不能加减乘除

1.2 定序尺度

概念:又称顺序尺度,它是对事物之间等级或顺序差别的一种测度。

举例:成绩 (A, B, C) 、绩点、学历、年级等。

特征

  1. 对事物可以分类、可以比较优劣和大小,
  2. 对应变量:次序变量
  3. 文字,数值(标签):不能加减乘除

1.3 定距尺度

概念:又称间隔尺度,是对事物类别或次序之间的间隔进行的一种测度。

举例:摄氏温度、年份等。

特征

  1. 能分类、比较大小,计量差距
  2. 没有绝对零点,“0”表示“0”水平,不表示“没有”或“不存在”。
  3. 对应变量:定距变量
  4. 数值,可以加减,不能乘除

1.4 定比尺度

概念:也称比率尺度,是对事物之间比值的一种测度。

举例:成绩(0-100)、年龄、企业的产值利润等

特征

  1. 分类、排序、比较大小、求出差异、计算两个数值之间的比率。
  2. 具有绝对零点,即数字 0 表示 “没有” 或 “不存在” 。
  3. 对应变量:定比变量
  4. 数值,可以加减乘除

1.5 四种计量尺度的比较

数字特征 定类尺度 定序尺度 定距尺度 定比尺度
分类 == != True True True True
排序 > < True True True
间距 + - True True
比值 * / True

四种尺度所包含的信息量是依次递增的,级别由低到高。( 定类 < 定序 < 定距 < 定比 )

根据较高层次的计量尺度可以获得较低层次的计量尺度。

不同的尺度数据对应着不同数据显示方法和分析方法。

1.6 统计数据的类型

定性数据 ( qualitative data ) :由 定类定序 尺度计量而成,反映事物的品质特征, 又称为属性数据。

定量数据 ( quantitative data ) :由 定距定比 尺度计量而成,反映事物的数量特征。

图 举例:

  • 定性数据:条形图、饼图

  • 定量数据:直方图,线图,茎叶图

分析方法 举例

  • 定性数据:频数,频率表,众数,列联表
  • 定量数据:均值,方差,相应回归分析

2 特殊的数据类型:时间与日期

R 语言用了一种特殊的数据类型来表示日期和时间

  • 日期用Date类来表示
  • 时间则是由两个不同的类:POS XctPOSIXIt

例如:查看当前日期和时间 date() Sys.Date() Sys.time()

1
2
3
4
5
6
> date()
[1] "Mon Mar 24 21:40:23 2025"
> Sys.Date()
[1] "2025-03-24"
> Sys.time()
[1] "2025-03-24 21:40:37 CST"

CST :英语全称为 Central Standard Time (USA) 、Central Standard Time (Australia)、China Standard Time 或 Cuba Standard Time 等四个地方。

2.1 日期 Date

  • 日期不包括时间,只表示“某年某月某日”。
  • 内部日期是以 1970年1月1日 至今的天数来存储。

2.1.1 as.Date() 函数基本使用

  • 日期作为 Date 类对象来存储,在 R 里的工作方式是输入一个字符串,比如 '1970-01-01' ,然后用 as.Date() 函数转换成日期。
  • as.Date() 方法默认传入字符串格式为 '年(4位)-月(2位)-日(2位)';或者 '年(4位)/月(2位)/日(2位)'

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
> date1 <- as.Date("2025-03-25")

> mode(date1)
[1] "numeric"
> class(date1)
[1] "Date"

> date2 <- as.Date("2025/03/25")

> mode(date2)
[1] "numeric"
> class(date2)
[1] "Date"

2.1.2 unclass(Date) 计算日期差

因为 R 语言采用距离 1970年1月1日 的天数来存储日期,所以使用 unclass() 可以检查距离 1970/01/01/ 相差的日期数。

1
2
3
4
5
6
7
8
> unclass(as.Date("2025/03/25"))
[1] 20172

> unclass(as.Date("1970/01/01")) # 距离 0 天
[1] 0

> unclass(as.Date("1969/12/31")) # 相差 -1 天
[1] -1

2.1.3 as.Date() 日期格式

默认格式as.Date 函数的默认日期格式为 '年(4位)-月(2位)-日(2位)' 例如"2008-10-24"

自定义格式

as.Date 函数支持通过 format 参数指定自定义日期格式。

符号 含义 示例
%d 数字表示的日期 01~31
%a 缩写的星期名 Mon
%A 非缩写星期名 Monday
%m 月份(00-12) 00~12
%b 缩写的月份 Jan
%B 非缩写月份 January
%y 两位数的年份 07
%Y 四位数的年份 2007

示例

1
2
as.Date("10/24/08", format="%m/%d/%y")
as.Date("October-24-2008", format="%B-%d-%Y")

2.1.4 日期计算

R 语言支持直接计算两个日期之间的差异,结果为 difftime 类型。

示例

1
2
3
4
5
6
T1 <- as.Date("October-24-2008", format="%B-%d-%Y")
T2 <- as.Date("October-28-2008", format="%B-%d-%Y")
time_diff <- T2 - T1
print(time_diff) # Time difference of 4 days
class(time_diff) # "difftime"
mode(time_diff) # "numeric"

注意事项

  • 如果日期字符串格式与 format 参数不匹配,as.Date 函数会返回 NA
  • 确保日期格式化符号与日期字符串中的分隔符一致。

2.2 时间 Times

2.2.1 strptime() 函数

strptime() 函数用于将字符串解析为时间对象。其语法如下:

1
strptime(x, format, tz = "")

参数说明

  • x: 表示时间的字符串。
    例如:"October-7-2015 10:40:30""December 9, 2011 9:10"
  • format: 转换格式,需与字符串格式对应。
    例如:%B-%d-%Y %H:%M:%S%B %d, %Y %H:%M
  • tz: 表示时区,默认为当前时区。
    例如:CST(北京时区),GMT(格林威治时间),UTC(世界协调时间)。

格式化符号

符号 含义 示例
%B 英文全拼月份 October
%d 第几天(01-31) 07
%Y 带世纪的年份 2015
%H 小时(00-24) 10
%M 分钟(00-59) 40
%S 秒(00-61) 30

示例代码

解析时间字符串

1
2
3
4
> datestring <- c("10 7, 2015 10:40", "10 9, 2011 9:10")
> x <- strptime(datestring, "%m %d, %Y %H:%M")
> print(x)
[1] "2015-10-07 10:40:00 CST" "2011-10-09 09:10:00 CST"

查看对象类型

1
2
> class(x)
[1] "POSIXlt" "POSIXt"

注意事项

  1. 格式匹配:确保 format 参数与时间字符串的格式完全一致,否则会返回 NA
  2. 时区设置:如果未指定 tz 参数,默认使用当前时区。
  3. 大小写敏感:格式化符号(如 %B)区分大小写,需确保正确使用。

2.2.2 POSIXct 和 POSIXlt

R 语言中,时间用两种类型表示:POSIXctPOSIXlt

1. POSIXct

定义:时间用大整数表示,即从 1970 年 1 月 1 日至今的秒数。

特点

  • 适合存储在数据框中,因为它本质上是一个很大的整数向量。
  • 适用于时间戳计算和存储。

示例

1
2
3
> time_ct <- as.POSIXct("2023-10-05 14:30:00")
> print(time_ct)
[1] "2023-10-05 14:30:00 CST"
2. POSIXlt

定义:时间以列表形式存储,包含更多与时间相关的信息。

特点

  • 包含星期几、一年中的第几天、月份、日期等详细信息。
  • 适合需要提取具体时间信息的场景。

示例

1
2
3
> time_lt <- as.POSIXlt("2023-10-05 14:30:00")
> print(time_lt)
[1] "2023-10-05 14:30:00 CST"

提取具体信息:

1
2
3
4
5
6
> print(time_lt$wday) # 星期几(0=周日,1=周一,...)
[1] 4
> print(time_lt$yday) # 一年中的第几天(0-365)
[1] 277
> print(time_lt$mon) # 月份(0-11,0=1月,1=2月,...)
[1] 9

2.2.3 类型转换

使用 as.POSIXct()as.POSIXlt() 函数可以在 POSIXctPOSIXlt 之间进行转换。

示例

1
2
3
4
5
6
7
8
9
> # 从 POSIXct 转换为 POSIXlt
> time_lt <- as.POSIXlt(time_ct)
> print(time_lt)
[1] "2023-10-05 14:30:00 CST"

> # 从 POSIXlt 转换为 POSIXct
> time_ct <- as.POSIXct(time_lt)
> print(time_ct)
[1] "2023-10-05 14:30:00 CST"

注意事项

时区问题:默认情况下,R 使用当前时区(如 CST)。可以通过 tz 参数指定时区,例如:

1
2
> as.POSIXct("2023-10-05 14:30:00", tz = "UTC")
[1] "2023-10-05 14:30:00 UTC"

时间格式:确保时间字符串与 as.POSIXct()as.POSIXlt() 的默认格式(%Y-%m-%d %H:%M:%S)一致,否则需要指定 format 参数。

2.2.4 时间处理注意事项

as.POSIXlt() 函数用于将时间转换为 POSIXlt 类,该类以列表形式存储时间信息,便于提取具体的时间元素(如秒、分钟、小时等)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
> # 获取当前时间
> x <- Sys.time()
> print(x) # 输出当前时间
[1] "2025-03-25 12:33:14 CST"

> # 查看时间类型
> class(x)
[1] "POSIXct" "POSIXt"

> # 转换为 POSIXlt 类
> tempx <- as.POSIXlt(x)
> print(tempx) # 输出转换后的时间
[1] "2025-03-25 12:33:14 CST"

> # 解构 POSIXlt 对象
> unclass(tempx) # 查看内部结构
# 包含许多属性,例如:$sec [1] 14.19524 、 $min [1] 33 等

> # 提取秒数 (POSIXlt 类 才可以提取秒数)
> seconds <- tempx$sec
> print(seconds) # 输出秒数(可能包含小数部分)
[1] 14.19524

计算日期差

1
2
3
4
5
6
7
8
> # 定义两个日期
> x <- as.Date("2012-03-01")
> y <- as.Date("2012-02-28")

> # 计算日期差
> time_diff <- x - y
> print(time_diff) # 输出: Time difference of 2 days
Time difference of 2 days

比较日期大小

1
2
3
4
> # 比较日期
> is_later <- x > y
> print(is_later)
[1] TRUE

只有同一类型的时间才可以比较计算等。