最近在处理时间格式的数据的时候总是出问题,结果是一堆NA,很是让人恼火,尤其是在?strptime后运行example里面的代码,还是一堆NA,彻底无语了。经过本人一番仔细检查后,发现了问题,希望可以帮到科研涉及到时间序列的同学,避免踩坑。

strptime()函数的参数为:

x:要转换的对象:strptime的字符向量,可以转换为strftime的“POSIXlt”的对象。
tz:指定用于转换的时区的字符串。特定于系统(请参见.POSIXlt),但“ ”是当前时区,“GMT”是UTC。在某些平台上,无效值通常被视为UTC,并带有警告。
format:字符串。如果任何元素的时间成分不是午夜,格式方法的默认值为“%Y-%m-%d%H:%m:%S”,否则为“%Y-%m-%d”。如果设置了选项(“digits.secs”),则最多可打印指定的数字数秒。
usetz:必然的是否应将时区缩写附加到输出中?这用于打印时间,比使用“%Z”更可靠。
digits:整数,用于在需要时确定秒的format()。

转换成人话,就是strptime()是一个转换格式的函数。

为什么我们需要这个函数呢,是因为自己准备的表格数据里面的时间的格式是字符串,R语言无法进行相应的时间加减运算,因此,需要用strptime()将字符串转换为时间格式。strptime()转换后的格式是“POSIXlt”,这种格式是通过数字存储时间的,而“POSIXct”格式是以列表形式存储时间的(POSIXct 最适用于存储和计算时间,而 POSIXlt 最适用于提取日期中的某个特定部分)。根据自己需求,如果想详细了解,参考:学习 R 之日期和时间 - 知乎 (zhihu.com)

回归到问题原来问题,例如下方函数运行,
strptime("1/jan/2001 12:56:23", "%d/%b/%Y %H:%M:%S")

运行结果:"2001-01-01 12:56:23 CST"

“1/jan/2001 12:56:23”的格式严格按照下方时间转换列表转换为%d/%b/%Y %H:%M:%S"",日期和时间中间有空格也相应的加空格,日期中间的‘/’或‘-’或其它的连接符保持对应,时间的‘:’同日期一样要对应,也可以参考下方时间缩写列表用简便格式代替(例如:%R代替%H:%M),strptime()函数是按照后方你转换的缩写形式读取表格内的时间文本的。

例:

“2010-2-3 6:42"对应的格式为”%Y-%m-%d %H:%M"

“5/18/1996 42:6"对应的格式为”%m/%d/%Y %M:%H"

“1/jan/2001"对应的格式为”%d/%b/%Y",这种带缩写字母的月份格式较为少见,运行的时候结果很大概率会是NA,这是因为月份缩写无法识别,需要在函数strptime()转换之前输入Sys.setlocale(“LC_TIME”, “C”),设定一下格式,再次运行结果就正确了。

相似函数:

format()功能较多,此处只解释时间用法,将时间格式转换成目标时间格式。

例:format(Sys.Date(), “%a %b %d”)

Sys.Date()是获取当前日期;"%a %b %d"是输出结果格式,可自行设定。

as.Date(),都是把字符串日期转换成Date格式

时间格式转换参考表:


世纪

%C
世纪(00–99):某时间的整年部分除以100。


%y

没有世纪的年份(00–99)。输入时,值00至68的前缀为20,69至99的前缀为19,这是2018年POSIX标准规定的行为,但它也表示“预计在未来版本中,从两位数年份推断出的默认世纪将改变”。

%Y

年与世纪。请注意,虽然原始公历中没有零,但ISO 8601:2004将其定义为有效(解释为1BC):参见https://en.wikipedia.org/wiki/0_(year)。然而,该标准还规定,其日历中1582年之前的年份只能在相关方同意的情况下使用。对于输入,仅接受0:9999年。


%m

月份为十进制数字(01–12)。

%b

此平台上当前区域设置中的缩写月份名称。(还匹配输入的全名:在某些语言环境中,没有名称缩写。)

%h

相当于%b。

%B

当前区域设置中的完整月份名称。(还匹配输入的缩写名称。)


%g

以周为单位的年份的最后两位数字(请参阅%V)。(接受,但在输入时忽略。)

%G

以周为单位的年份(见%V)为十进制数字。(接受,但在输入时忽略。)

%V

ISO 8601中定义的以十进制数字(01–53)表示的一年中的一周。如果包含1月1日的一周(从星期一开始)在新的一年有四天或四天以上,则将其视为第1周。否则,它是前一年的最后一周,下一周是第1周(已接受,但输入时忽略)。

%U

以十进制数字(00–53)表示的一年中的某一周,将星期日作为一周的第一天(通常将一年的第一个星期日作为第1周的第1天)。美国公约。

%W

以十进制数字(00–53)表示的一年中的一周,使用星期一作为一周的第一天(通常将一年的第一个星期一作为第1周的第1天)。英国公约。


%a

此平台上当前区域设置中的缩写工作日名称。(还匹配输入的全名:在某些语言环境中,没有名称缩写。)

%A

当前区域设置中的工作日全名。(还匹配输入的缩写名称。)

%d

以十进制数字(01–31)表示的月份的第几天

%e

以十进制数字(1–31)表示月份的第几天,前导空格表示一位数字。

%j

以十进制数字表示的日期(001–366):对于输入,366仅在闰年有效。

%u

工作日为十进制数字(1-7,周一为1)。

%w

工作日为十进制数字(0–6,星期日为0)。


%H

小时数为十进制数(00–23)。作为特殊异常字符串,例如"24:00:00" 接受输入,因为ISO 8601允许这样做。

%I

小时数为十进制数(01–12)。


%M

以十进制数字(00–59)表示分钟。


%S

秒为整数(00–61),最多允许两个闰秒(但符合POSIX的实现将忽略闰秒)。

特殊格式

%n

输出换行,输入任意空白。

%p

区域设置中的AM/PM指示器。与%I一起使用,而不是与%H一起使用。某些区域设置中的空字符串(例如,在某些操作系统、非英语欧洲区域设置(包括俄罗斯)中)。如果用于此类区域设置中的输入,则行为未定义。一些平台接受%P作为输出,它使用小写版本(%P也可以使用小写):其他平台将输出P。

%r

对于输出,12小时时钟时间(使用区域设置的AM或PM):仅在某些区域设置中定义,在某些操作系统上,在没有定义AM/PM指示符的区域设置中会产生误导。对于输入,相当于%I:%M:%S%p。

%t

选项卡显示输出,任意空白显示输入。

%z

以小时和分钟表示的与UTC的签名偏移量,因此-0800比UTC晚8小时。接受不超过+1400的值。(标准仅用于输出。对于输入,R当前在所有平台上都支持它。)

%Z

(仅限输出。)时区缩写为字符串(如果不可用,则为空)。当时区多年来更改了缩写时,这可能不可靠。


缩写格式

%D

日期格式,如%m/%d/%y:C99标准规定应该是这种格式(但并非所有操作系统都符合)。

%F相当于%Y-%m-%d(ISO 8601日期格式)。%R相当于%H:%M。%T相当于%H:%M:%S。%x日期特定于区域设置的输出,“%y/%m/%d”的输入。%X时间特定于区域设置的输出,“%H:%M:%S”的输入。

%c

日期和时间。特定于区域设置的输出,“%a%b%e%H:%M:%S%Y”的输入。


当显示前导零时,它们将用于输出,但在输入时是可选的。名称在输入时不区分大小写匹配:它们是否在输出时大写取决于平台和语言环境。请注意,缩写名称是特定于平台的(尽管标准在“⁠C⁠’ locale必须是大写英文名称的前三个字母:此约定在英语语言区域设置中广泛使用,但例如,法语月份缩写在Linux、macOS、Solaris和Windows中的任何两个都不相同)。如果要将%a、%b或%h用作输入格式的一部分,了解缩写是什么是至关重要的:请参阅示例以了解如何检查。

当将%z或%z用于具有指定时区的对象的输出时,会尝试使用该时区的值,但不一定成功。