pandas的to_datetime时间转换使用及学习心得

前言

昨天在网赛中做了一道题,虽然是外国人的Englis题目,但是内容很有学习的价值,值得仔细的学习,今天就把我所收获的一部分记录下来。其一:做个学习的资料记录。其二:分享出来,供大家参考。

(收获了对处理大数据的又一次认识!!!)

这是一道将DataFrame的日期数据转换为python能认识的题目。这里重点讲一下to_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)

一部分错误信息如上。

面对加载都要加载半天的数据出了错误,你真的是无助的,如果要去看数据怕是要看一天。

当然有人会说不是有错误信息吗?当然我知道,但是一但当信息量大了以后,当时是茫然的。花了半天查找其他时间的转换方式。无果。于是静下心来发现问题。可以看出它说有一下格式不能转换。

'1975-02-23T02:58:41.000Z'

所以我又换了一种格式将时分秒都匹配了,又提醒年月日不匹配。反复的验证后发现应该是原数据有问题,部分时间并不是同意的格式。哈哈发现问题了,我们可以修改了。

我第一次的修改方式为:

data['over_long'] = data['Date'].apply(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')
data['date_parsed'] = pd.to_datetime(data['Date'],infer_datetime_format=True)

两个都能实现我试了一下。毕竟对to_datetime不太熟悉所以犯了错。

OK!全部完成了。但是我想说的以上都不是最重要的。

最重要的是一种经验的掌握。当你面对大量的数据时千万不要紧张,它们也是小数据构成的,只要冷静下来,你就能想到方法来解决。这才是我想说的!!!与君共勉。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • 对pandas中时间窗函数rolling的使用详解

    在建模过程中,我们常常需要需要对有时间关系的数据进行整理.比如我们想要得到某一时刻过去30分钟的销量(产量,速度,消耗量等),传统方法复杂消耗资源较多,pandas提供的rolling使用简单,速度较快. 函数原型和参数说明 DataFrame.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None) window:表示时间窗的大小,注意有两种形式

  • pandas 两列时间相减换算为秒的方法

    如下所示: pd.to_datetime(data[data['last_O_XLMC']==data['O_XLMC']]['O_SJFCSJ'], format='%H:%M:%S')-pd.to_datetime(data['last_O_SJFCSJ'], format='%H:%M:%S')).dt.total_seconds() 以上这篇pandas 两列时间相减换算为秒的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • python+pandas+时间、日期以及时间序列处理方法

    先简单的了解下日期和时间数据类型及工具 python标准库包含于日期(date)和时间(time)数据的数据类型,datetime.time以及calendar模块会被经常用到. datetime以毫秒形式存储日期和时间,datetime.timedelta表示两个datetime对象之间的时间差. 给datetime对象加上或减去一个或多个timedelta,会产生一个新的对象 from datetime import datetime from datetime import timedel

  • python时间日期函数与利用pandas进行时间序列处理详解

    python标准库包含于日期(date)和时间(time)数据的数据类型,datetime.time以及calendar模块会被经常用到. datetime以毫秒形式存储日期和时间,datetime.timedelta表示两个datetime对象之间的时间差. 下面我们先简单的了解下python日期和时间数据类型及工具 给datetime对象加上或减去一个或多个timedelta,会产生一个新的对象 from datetime import datetime from datetime impo

  • python pandas生成时间列表

    python生成一个日期列表 首先导入pandas import pandas as pd def get_date_list(begin_date,end_date): date_list = [x.strftime('%Y-%m-%d') for x in list(pd.date_range(start=begin_date, end=end_date))] return date_list ### 可以测试 print(get_date_list('2018-06-01','2018-0

  • pandas 时间格式转换的实现

    OUTLINE  常见的时间字符串与timestamp之间的转换 日期与timestamp之间的转换 常见的时间字符串与timestamp之间的转换 这里说的字符串不是一般意义上的字符串,是指在读取日期类型的数据时,如果还没有及时解析字符串,它就还不是日期类型,那么此时的字符串该怎么与时间戳之间进行转换呢? ① 时间字符串转化成时间戳将时间字符串转化成时间戳分为两步: 第一步:将时间字符串转换成时间元组 第二步:将时间元组转换成时间戳类型 import time data['timestamp'

  • python pandas 对时间序列文件处理的实例

    如下所示: import pandas as pd from numpy import * import matplotlib.pylab as plt import copy def read(filename): dat=pd.read_csv(filename,iterator=True) loop = True chunkSize = 1000000 R=[] while loop: try: data = dat.get_chunk(chunkSize) data=data.loc[:

  • pandas的object对象转时间对象的方法

    如下所示: df = pd.read_table('G:/tc/dataset/user_view.txt', sep=",")#读取文件 df.columns = ["a", "b", "c"]#列命名 df['c'] = pd.to_datetime(df['c'],format='%Y-%m-%d %H:%M:%S')#将读取的日期转为datatime格式 x=[i.year for i in df["c&qu

  • 利用numpy和pandas处理csv文件中的时间方法

    环境:numpy,pandas,python3 在机器学习和深度学习的过程中,对于处理预测,回归问题,有时候变量是时间,需要进行合适的转换处理后才能进行学习分析,关于时间的变量如下所示,利用pandas和numpy对csv文件中时间进行处理. date (UTC) Price 01/01/2015 0:00 48.1 01/01/2015 1:00 47.33 01/01/2015 2:00 42.27 #coding:utf-8 import datetime import pandas as

  • pandas进行时间数据的转换和计算时间差并提取年月日

    #pd.to_datetime函数 #读取数据 import pandas as pd data = pd.read_csv('police.csv') #将stop_date转化为datetime的格式的dataframe,存到stop_datetime data['stop_datetime'] = pd.to_datetime(data.stop_date') #自定义一个时间,计算时间差 data_new = pd.to_datetime('2006-01-01') data['time

随机推荐