由于在Pandas中经常要处理到时间序列数据,需要把一些object或者是字符、整型等某列进行转换为pandas可识别的datetime时间类型数据,方便时间的运算等操作。基于前两篇文章的基础:
一文速学-Pandas中DataFrame转换为时间格式数据与处理
一文速学-Pandas处理时间序列数据操作详解
在这两篇文章中基本把pandas操作时间类型数据的一些常规操作都有提及和展示,作为重要相关函数to_datetime(),该函数参数值得单独拿出来讲一讲,可以省去很多转换之后的BUG错误。
目录
前言
一、基本语法与功能
二、参数说明和代码演示
1. arg
2.errors
3.dayfirst
4.yearfirst
5.utc
6.format
7.exact
8.unit
9.infer_datetime_format
10.origin
11.cache
三、返回类型
1.datetime
2.raises
ParserError
ValueError
点关注,防走丢,如有纰漏之处,请留言指教,非常感谢
基本语法:
pandas.to_datetime( arg,
errors='raise',
dayfirst=False,
yearfirst=False,
utc=None,
format=None,
exact=True,
unit=None,
infer_datetime_format=False,
origin='unix',
cache=True)
基本功能:
该函数将一个标量,数组,Series或者是DataFrame/字典类型的数据转换为pandas中datetime类型的时间类型数据。
若是直接使用该函数不使用它的其他参数功能:
import pandas as pd
from datetime import datetime
import numpy as np
df_csv=pd.read_csv('file.csv')
df_csv['collect_date']=pd.to_datetime(df_csv['collect_date'])
可以把()内的DataFrame和Series、array等转换为datetime数据类型:
collect_date datetime64[ns]
Parameters: | arg : integer, float, string, datetime, list, tuple, 1-d array, Series
errors : {‘ignore’, ‘raise’, ‘coerce’}, default ‘raise’
dayfirst : boolean, default False
yearfirst : boolean, default False
utc : boolean, default None
box : boolean, default True
format : string, default None
exact : boolean, True by default
unit : string, default ‘ns’
infer_datetime_format : boolean, default False
origin : scalar, default is ‘unix’
cache : boolean, default False
|
---|---|
Returns: | ret : datetime if parsing succeeded.
|
上述是官方文档:pandas.to_datetime
首先我们将逐个了解每个参数的功能和作用,之后再进行实例使用。
接受类型:{int, float, str, datetime, list, tuple, 1-d array, Series, DataFrame/dict-like( 0.18.1版本一下不支持)}
该参数指定了要转换为datetime的对象。如果提供的是Dataframe,则该类型至少需要以下列:“年”、“月”、“日”,才能转化为datetime。
也就是说你直接传入一个dataframe是不可能实现的,会报错:
ValueError: to assemble mappings requires at least that [year, month, day] be specified: [day,month,year] is missing
但是只要DataFrame里面带了列名为‘year’,‘month’,‘day’就可以合并:
df_time=pd.DataFrame({'year':[2022,2022,2022],
'month':[6,6,6],
'day':[13,14,15]})
df_time=pd.to_datetime(df_time)
0 2022-06-13 1 2022-06-14 2 2022-06-15 dtype: datetime64[ns]
但是如果非可识别的时间索引,就会报错:
df_time=pd.DataFrame({'year':[2022,2022,2022],
'month':[6,6,6],
'day':[13,14,15],
'value':[1,2,3]})
df_time=pd.to_datetime(df_time)
df_time
ValueError: extra keys have been passed to the datetime assemblage: [value]
所以一般传入一个series或者dataframe的一列转换最好。
接受类型:{‘ignore’, ‘raise’, ‘coerce’},默认:default ‘raise’
我们将errors设置为coerce时:
df_time=pd.DataFrame({'time':['2022/6/13','2022/6/14','2022/6/15'],
'master':['桃花','哈士奇','派大星'],
'value':[13,14,15]})
df_time['master']=pd.to_datetime(df_time['master'],errors='coerce')
将errors设置为‘ignore’时:
df_time=pd.DataFrame({'time':['2022/6/13','2022/6/14','2022/6/15'],
'master':['桃花','哈士奇','派大星'],
'value':[13,14,15]})
df_time['master']=pd.to_datetime(df_time['master'],errors='ignore')
不会报错,不改动:
接受类型:{bool},默认为False
如果arg是str或相似的列表类型,需要指定日期分析顺序。如果为True,则首先解析日期,例如,“2012年11月10日”被解析为2012年11月10日。
df_time=pd.DataFrame({'time':['13/6/2022','14/6/2022','15/6/2022'],
'master':['桃花','哈士奇','派大星'],
'value':[13,14,15]})
df_time['time']=pd.to_datetime(df_time['time'],dayfirst=True)
df_time
如果我们传入的日期超过了31天,则将给予警告:
ParserError: day is out of range for month: 32/6/2022
接受类型:{bool},默认为False
如果arg是str或相似的列表类型,需要指定日期分析顺序。
如果为True,则将日期解析为第一年,例如,“2012年11月10日”解析为2010年11月12日。
如果dayfirst和yearfirst都为True,则在yearfirst优先(与dateutil相同)。yearfirst=True不严格,但更倾向于使用yearfirst进行分析。
df_time=pd.DataFrame({'time':['13/6/22','14/6/22','15/6/22'],
'master':['桃花','哈士奇','派大星'],
'value':[13,14,15]})
df_time['time']=pd.to_datetime(df_time['time'],yearfirst=True)
接受类型:{bool},默认为None
该参数控制与时区相关的解析、本地化和转换。
utc为时间协调时,又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。中国大陆采用ISO 8601-1988的《数据元和交换格式信息交换日期和时间表示法》(GB/T 7408-1994)称之为国际协调时间,代替原来的GB/T 7408-1994;中国台湾采用CNS 7648的《资料元及交换格式–资讯交换–日期及时间的表示法》,称之为世界统一时间。
df_time['time']=pd.to_datetime(df_time['time'],utc=True)
df_time['time']=pd.to_datetime(df_time['time'],utc=False)
关于更多可以了解 Time zone handling
接受类型:{str}默认default None
解析时间的strftime,例如%d/%m/%Y”。请注意,“%f”将一直解析到纳秒。有关选项的更多信息,请参阅strftime文档。strftime时间字符:
df_time=pd.DataFrame({'time':['2013/6/22','2014/6/22','2015/6/22'],
'master':['桃花','哈士奇','派大星'],
'value':[13,14,15]})
df_time['time']=pd.to_datetime(df_time['time'],format='%Y/%m/%d')
这里会把时间统一 换成yyyy-mm-dd的形式,等于说是限定死了time的格式,不对的格式将直接报错。
接受类型:{bool}默认default None
控制格式的使用方式:
df_time=pd.DataFrame({'time':['2013/6/22','2014/6/22','2015/6/22'],
'master':['桃花','哈士奇','派大星'],
'value':[13,14,15]})
df_time['time']=pd.to_datetime(df_time['time'],format='%Y/%d/%m',exact=False)
df_time
如果为True则报错:
ValueError: unconverted data remains: 2
接受类型:{str}默认 default ‘ns’
arg的单位(D、s、ms、us、ns)表示该单位,它是一个整数或浮点数。这将基于原点。例如,使用unit='ms'和origin='unix'(默认值),这将计算到unix epoch开始的毫秒数。
像我们传入的这些yyyy-mm-dd的类型是不行的,这个解析的是时间戳的形式:
df_time=pd.DataFrame({'time':['14524','14525','42512'],
'master':['桃花','哈士奇','派大星'],
'value':[13,14,15]})
df_time['time']=pd.to_datetime(df_time['time'],unit='ms')
该计算开始日期为1970-01-01 00:00:00,可以通过origin来调整。
df_time=pd.DataFrame({'time':['14524','14525','42512'],
'master':['桃花','哈士奇','派大星'],
'value':[13,14,15]})
df_time['time']=pd.to_datetime(df_time['time'],unit='d')
调整unit的参数可以让函数识别传入时间的值:
df_time=pd.DataFrame({'time':['14524','14525','42512'],
'master':['桃花','哈士奇','派大星'],
'value':[13,14,15]})
df_time['time']=pd.to_datetime(df_time['time'],unit='d')
接受类型:{bool}默认default False
如果为True且未给出格式,则尝试根据第一个非NaN元素推断datetime字符串的格式,如果可以推断,可切换到更快的解析方法。在某些情况下,这可以将解析速度提高约5-10倍。
如果给出的时间序列是固定的,则建议把这个参数调整为True可以加快检索速度。
接受类型:{scalar},默认 default ‘unix’
定义参考日期。数值将被解析为自该参考日期以来的单位数(由单位定义)。
接受类型:{bool}默认default True
如果为True,使用唯一的已转换日期缓存来应用日期时间转换。在分析重复的日期字符串时,尤其是带有时区偏移的日期字符串时,可能会产生显著的加速。仅当至少有50个值时才使用缓存。存在越界值将导致缓存不可用,并可能会减慢解析速度。
如果分析成功。返回类型取决于输入(括号中的类型对应于时区分析失败或时间戳分析超出范围时的回退)
从字符串分析日期时失败。
当另一个日期时间转换错误发生时。例如,数据帧中缺少“年”、“月”、“日”列之一,或者时区感知日期时间。datetime位于类似混合时间偏移的数组中,utc=False。
以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期见