码迷,mamicode.com
首页 > 其他好文 > 详细

pandas的TimeStamp Numpy的datetime64和pendulum转型问题

时间:2018-12-20 22:45:37      阅读:1363      评论:0      收藏:0      [点我收藏+]

标签:知名度   今天   err   doc   info   数据库表   end   其他   .com   

今天被这俩货因为时间日期处理不兼容的问题折腾半天,气死人,不吐槽不行了!

pandas 和 pendulum 知名度都很高,也很常用。但我就是用不习惯!各种小坑让我特别不爽。

pandas的api让我觉得奇葩。根本没有其他py库连蒙带猜就能平顺执行的感觉,反正感觉和py风格不太搭。只是个人感觉。用其他知名库从来没这种感觉。

然后它的很多操作,都是列优先的,df[‘A‘] 取一列,然后做某事。这是数据固定,处理数据时方便。

但,如果有时偷懒,当成数据库表,想按行操作,就非常别扭。连遍历都得是 for i,r  in df.iterrows():      只能说是相当不py的写法。。

 

其实现在pd用起来感觉现在稍微好点了,loc  iloc,  以前还有乱七八糟的ix之类。还有过想修改覆盖某列时,动不动warning说copy怎么怎么样了,看半天文档我也记不住该怎么搞,还TM挺长。TM老子愿意这样写,TMBB什么啊,(就类似这种,df[‘c‘] = df[‘c‘]XXX 记不清了,反正最近好像总算不提示了,你TM api反)

 

pendulum的文档特别没有条理,我从来找不到想用的功能。得一直看很长。

https://pendulum.eustace.io/docs/

而且2和1代还换过1次API风格。

 

而且这俩简称都可以是pd的库,都TM够轴的,互相兼容极差。

pandas 用的时区是pytz,而pendulum自己搞了一套时区,还特意写一篇文章自称比pytz好很多,但问题是,用的时候就恶心了

按说两个star都很高的库,互相兼容,应该是天经地义的啊。

 

pandas 如果把类似datetime的列定为index 会被转型成TimeStamp。还可以显示设置为DateTimeIndex,这还不算完

最坑的地方是:  如果我这样

[idx for idx in df.index]

遍历出来的是 TimeStamp型

但如果 [idx for  list(df.index.values)]

得到的却是numpy.datetime64型。

最大的区别就是timezone。

大概是这样了:

TimeStamp                           ->   numpy.datetime64

‘2004-06-07T15:00:00+08:00‘ -> ‘2018-02-23T07:00:00.000000000‘
 

虽然找到了这个图参考,但是其实没解决我的问题。

技术分享图片

https://cloud.tencent.com/developer/ask/29186

 

用比较恶心的方法解决掉这个问题

    if isinstance(obj_in, pd.Timestamp):
        str_without_tz = obj_in.strftime("%Y-%m-%dT%H:%M:%S")
        dt = pendulum.parse(str_without_tz, tz=tzinfo)
    elif isinstance(obj_in, np.datetime64):
        #‘2004-06-07T15:00:00+08:00‘ -> ‘2018-02-23T07:00:00.000000000‘ 
        # 在self.df.index.values 时遇到 dt.strftime("%Y-%m-%dT%H:%M:%S")得到 2004-06-03T07:00:00+08:00 奇葩无法处理
        dt = pd.Timestamp(obj_in)
        str_without_tz = dt.strftime("%Y-%m-%dT%H:%M:%S")
        #print(str_without_tz)
        dt = pendulum.parse(str_without_tz, tz=UTC)
        dt = to_zone.convert(dt)

 

 

比如pendulum 转 pandas TimeStamp,一不留神就报告DateTime上缺nanosecond属性,github上也有人报这个问题,

我只能这样

def dt2pd(dt):
    ‘‘‘pendulum 和pd不兼容‘‘‘
    assert isinstance(dt, pendulum.DateTime)
    #print(dt)
    res_str = dt.strftime("%Y-%m-%dT%H:%M:%S")
    #print(res_str)
    return pd.Timestamp(res_str, tz=dt.timezone.name)

 

pandas的TimeStamp Numpy的datetime64和pendulum转型问题

标签:知名度   今天   err   doc   info   数据库表   end   其他   .com   

原文地址:https://www.cnblogs.com/xuanmanstein/p/10152853.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!