pd.to_datetime 时间转换datetime
ZSYL 人气:9时间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'].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 遇到不能转化的时间数据后会跳过。
参考:
加载全部内容