【问题标题】:Pandas parse non-english string datesPandas 解析非英语字符串日期
【发布时间】:2016-12-09 00:50:55
【问题描述】:

Pandas 非常擅长解析英文字符串日期:

In [1]: pd.to_datetime("11 January 2014 at 10:50AM")
Out[1]: Timestamp('2014-01-11 10:50:00')

我想知道当字符串是另一种语言(例如法语)时,是否有一种简单的方法可以使用 pandas 来做同样的事情:

In [2]: pd.to_datetime("11 Janvier 2016 à 10:50")

ValueError: 未知的字符串格式

理想情况下,有一种方法可以直接在 pd.read_csv 中进行。

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    有一个名为 dateparser 的模块能够处理多种语言,包括法语、俄语、西班牙语、荷兰语等 20 多种。它还可以识别时区缩写等内容。

    让我们确认它适用于单个日期:

    In [1]: import dateparser
            dateparser.parse('11 Janvier 2016 à 10:50')
    Out[1]: datetime.datetime(2016, 1, 11, 10, 50)
    

    继续解析这个test_dates.csv 文件:

                   Date  Value
    0    7 janvier 1983     10
    1  21 décembre 1986     21
    2    1 janvier 2016     12
    

    您实际上可以使用dateparser.parse 作为解析器:

    In [2]: df = pd.read_csv('test_dates.csv',
                             parse_dates=['Date'], date_parser=dateparser.parse)
            print(df)
    
    Out [2]:
            Date  Value
    0 1983-01-07     10
    1 1986-12-21     21
    2 2016-01-01     12
    

    显然,如果您需要在已经加载数据框后执行此操作,您始终可以使用 apply 或 map:

    # Using apply (6.22 ms per loop)
    df.Date = df.Date.apply(lambda x: dateparser.parse(x))
    
    # Or map which is slightly slower (7.75 ms per loop)
    df.Date = df.Date.map(dateparser.parse)
    

    【讨论】:

      【解决方案2】:

      如果您设置适当的语言环境并设置解析格式,它也可以正常工作:

      import locale
      locale.setlocale(locale.LC_ALL, 'fr_FR')
      
      import pandas as pd
      pd.to_datetime("11 Janvier 2016 à 10:50", format='%d %B %Y à %H:%M')
      # Timestamp('2016-01-11 10:50:00')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-21
        • 1970-01-01
        • 2014-12-11
        相关资源
        最近更新 更多