pd.to_datetime时间object转换datetime实例
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pd.to_datetime时间object转换datetime实例相关的知识,希望对你有一定的参考价值。
时间object转换datetime实例
时间object转换datetime实例
首先说一下:
- 1/17/07 has the format "%m/%d/%y"
- 17-1-2007 has the format "%d-%m-%Y"
这是一部分的时间转换格式,通过以上的格式,你可以将DataFrame中的时间格式转换为以下等python格式:
0 2007-03-02
1 2007-03-22
2 2007-04-06
3 2007-04-14
4 2007-04-15
Name: date_parsed, dtype: datetime64[ns]
dtype:datetime64
,这是转换过后的形式,其实你可以将原数据使用dtype查看列,来看它的格式。你会发现它是object
形式的。这个object
格式一般是python
用来记录可变化的兑现的格式。这个格式并不能认出是时间格式,尽管我们一眼就能看出,但机器不行。
data = pd.read_csv('path') # 获取data数据
data['date'].heade() # 查看一下日期列
0 01/02/1965
1 01/04/1965
2 01/05/1965
3 01/08/1965
4 01/09/1965
Name: Date, dtype: object
可以看出它为object格式,并非日期格式。
data['date_parsed'] = pd.to_datetime(data['date'], format="%m/%d/%y")
上面我们按python格式转换时间,并添加到新的一列中去。
dara['date_parsed'].head() #查看一下结果
0 1965-01-02
1 1965-01-04
2 1965-01-05
3 1965-01-08
4 1965-01-09
Name: data_parsed, dtype: datetime64[ns]
处理过程中可能会出现问题:
/opt/conda/lib/python3.6/site-packages/pandas/core/tools/datetimes.py in _convert_listlike(arg, box, format, name, tz)
271 try:
272 result = array_strptime(arg, format, exact=exact,
--> 273 errors=errors)
274 except tslib.OutOfBoundsDatetime:
275 if errors == 'raise':
pandas/_libs/tslibs/strptime.pyx in pandas._libs.tslibs.strptime.array_strptime()
ValueError: time data '1975-02-23T02:58:41.000Z' does not match format '%m/%d/%Y' (match)
反复的验证后发现应该是原数据有问题,部分时间数据格式有误:
比如: 1965-01-02,这是正常时间格式,但是有的时间数据是:1965-01-028、1969-011-26 等情况,时间数据长度超过正常的len=10.
因此我们需要数据预处理,清洗数据。
数据预处理
方式一
添加一列记录为每行时间的长度,apply(len)
:传入len()
函数,处理Date
列数据。
data['over_long'] = data['Date'].apply(len) # 添加一列记录为每行时间的长度,apply(len):传入len()函数
data.loc[data['over_long'] > 10] # 输出大于正常数据的行 这里会发现缺失有那么几行在作怪!!!
正常处理:
normal_dates = data.loc[data['over_long'] < 11] # 筛选出正常数据
normal_dates = normal_dates.copy() # 拷贝
normal_dates['data_parsed'] = pd.to_datetime(normal_dates['Date'],format='%m/%d/%Y') # 再次转换时间,没有报错
normal_dates['data_parsed'].head(10) # 输出查看没问题的数据
方式二
data['date_parsed'] = pd.to_datetime(data['Date'], format = "%m/%d/%Y", errors = 'coerce')
errors = 'coerce'
Pandas数据转换时遇到不能转换的数据转为NaN的参数设置 errors='coerce'
Pandas 提供了一个可选的参数 errors
,传入 errors='coerce'
,Pandas 遇到不能转换的数据就会赋值为 NaN(Not a Number)
在这里,Pandas 遇到不能转化的时间数据后会赋值 Nan 并跳过。
方式三
data['date_parsed'] = pd.to_datetime(data['Date'], infer_datetime_format=True)
infer_datetime_format
: boolean类型
, default False
如果设定为True
并且 parse_dates
可用,那么pandas将尝试转换为日期类型,如果可以转换,转换方法并解析。在某些情况下会快5~10
倍。
在这里,Pandas 遇到不能转化的时间数据后会跳过。
参考:
以上是关于pd.to_datetime时间object转换datetime实例的主要内容,如果未能解决你的问题,请参考以下文章