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!全部完成了。但是我想说的以上都不是最重要的。

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




  • 67
    点赞
  • 189
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
pandas库提供了to_datetime函数用于将字符串或其他格式的日期转换为日期时间对象。如果转换出现错误,可能是由于输入数据格式不正确或输入数据不符合日期时间的规范。 通常情况下,to_datetime函数会根据输入数据的格式自动识别并正确地将其转换为日期时间对象。然而,如果转换结果出现错误或转换的结果与预期不符,可能是由于输入数据的格式与函数参数不匹配,或者输入数据本身有问题。 要解决这个问题,有几个步骤可以尝试: 1. 检查输入数据的格式是否正确。确保输入的日期字符串或其他格式的数据符合日期时间的标准格式。可以使用datetime模块来验证和解析日期字符串,根据需要进行格式调整。 2. 检查to_datetime函数的参数是否设置正确。to_datetime函数有一些可选参数,如格式字符串(format)、是否将错误的日期置为NaT(invalid)等。根据输入数据的格式和要求,适当地设置这些参数,以确保转换的准确性。 3. 通过调整输入数据的格式来解决问题。如果输入数据的格式与pandas的默认预期不同,可以尝试先将其转换为标准的日期字符串格式,然后再进行转换。 总之,对于pandas to_datetime函数转换出现错误或结果不符合预期的情况,可以通过验证输入数据的格式、调整to_datetime函数的参数或调整输入数据的格式来解决问题。根据具体情况,采取适当的步骤来纠正错误转换

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值