解析pandas中的日期字符串

 mobiledu2502912043 发布于 2023-01-30 18:20

对于提出一个已经多次全面解决的问题,我深表歉意.我的问题是,我试图复制粘贴,因为是SO帖子中的例子,但是没有为我工作.我的数据格式为"dd mm YYYY HH mm ss value value".我想把它读作一个pandas数据帧,第一列作为日期字符串.以下是我在SO帖子中尝试的示例:1.第一个示例数据

01 05 2013 00 00 00     26.4    16.5
02 05 2013 00 00 00     25.9    17.7
03 05 2013 00 00 00     26.6    17.4
......

添加HH mm ss的零只是为了完全符合示例.

    其次是进口包裹

    从datetime import datetime导入pandas作为pd import os来自cStringIO import StringIO

    fname = os.path.expanduser('./ temps0.txt')

    现在我尝试了三个例子

    a)来自SO帖子:

    使用python中的pandas,将年月日和小时的日期分解在单独的列中

    def dt_parse(date_string):dt = pd.datetime.strptime(date_string,'%d%m%Y')return dt df = pd.read_csv(fname,header = None,index_col ='datetime',parse_dates = {'datetime ':[0,1,2,4,5,6]},date_parser = lambda x:pd.datetime.strptime(x,'%d%m%Y'))date_parser = dt_pasre)

这是错误的一部分

File "/home/zmumba/anaconda/lib/python2.7/site-packages/pandas/io/parsers.py",
 line 1763, in _try_convert_dates
    colnames.append(str(columns[c]))
IndexError: list index out of range

b)另一个尝试,从SO帖子:

/sf/ask/17360801/

parse = lambda x: datetime.strptime(x, '%d%m%Y')
pd.read_table("./temps0.txt",  parse_dates = [['DD MM YYYY HH mm ss']],
                               index_col = 0,
                               date_parser=parse)

这是错误的一部分

File "/home/zmumba/anaconda/lib/python2.7/site-packages/pandas/io/parsers.py",
 line 1009, in _set
    self._reader.set_noconvert(names.index(x))
ValueError: 'DD MM YYYY HH mm ss' is not in list

c)另一个尝试,从SO帖子:

/sf/ask/17360801/?lq=1
def date_parser(ss):
    day, month, year, hour, min, sec = ss.split()
    return pd.Timestamp('20%s-%s-%s %s:%s:%s' % (year, month, day, hour, min, sec))
df = pd.read_csv('temps0.txt', header=None, sep='\s+\s', parse_dates=[[0]], date_parser=date_parser)

这是错误的一部分

File "", line 2, in date_parser
ValueError: too many values to unpack

请原谅我的无知,因为我主要是通过SO帖子来学习(官方文档完全缺乏示例,以便清晰).

1 个回答
  • 在Chang的回答中,他使用了一个解析器,这是你需要调整以匹配日期字符串的日期格式:

    import datetime
    parse = lambda x: datetime.strptime(x, '%d %m %Y %H %M %S')
    

    您还需要调整列名称,在该示例中类似于格式,这有点令人困惑.这里我们没有列名,所以我们可以使用数字(对于列的位置,并告诉read_csv使用header = None):

    from StringIO import StringIO
    csv = '''01 05 2013 00 00 00,26.4,16.5
    02 05 2013 00 00 00,25.9,17.7
    03 05 2013 00 00 00,26.6,17.4'''
    

    注意:我们使用header = None,因为没有列名.

    df = pd.read_csv(StringIO(csv), parse_dates=[0],
                                    index_col=0,
                                    date_parser=parse,
                                    header=None)
    In [11]: df
    Out[11]:
                   1     2
    0                     
    2013-05-01  26.4  16.5
    2013-05-02  25.9  17.7
    2013-05-03  26.6  17.4
    

    如果您的数据由多个空格(两个以上)而不是逗号分隔,则使用sep参数:

    csv = '''01 05 2013 00 00 00     26.4    16.5
    02 05 2013 00 00 00     25.9    17.7
    03 05 2013 00 00 00     26.6    17.4'''
    
    In [21]: pd.read_csv(StringIO(csv), parse_dates = [0],
                               index_col = 0,
                               date_parser=parse,
                               header=None, sep='\s\s+')
    Out[21]: 
                   1     2
    0                     
    2013-05-01  26.4  16.5
    2013-05-02  25.9  17.7
    2013-05-03  26.6  17.4
    

    注意:io文档有很多细节,有很多例子.

    2023-01-30 18:22 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有