首先说一下:
- 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'].head() # 查看一下日期列
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() #查看一下结果 1 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 遇到不能转化的时间数据后会跳过。
参考:
link
link
到此这篇关于pd.to_datetime中时间object转换datetime实例的文章就介绍到这了,更多相关pd.to_datetime 时间转换datetime内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!