目录
  • 数据预处理
    • 方式一
    • 方式二
    • 方式三
  • 参考:

    时间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 遇到不能转化的时间数据后会跳过。

    参考:

    Link

    Link

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。