【问题标题】:force format when parsing dates in pandas from an Excel file从 Excel 文件中解析 pandas 中的日期时强制格式
【发布时间】:2018-01-28 06:17:59
【问题描述】:

我正在尝试按照给定格式 %d/%m/%y 解析 Excel 文件中的日期。我无法设置格式,我总是收到%m/%d/%Y

源格式为%d/%m/%y,因此第一个日期应该是 2016 年 6 月 1 日。有什么想法吗?

import pandas as pd

url = 'https://www.dropbox.com/s/8gqmq3jx27unsta/example_dates.xlsx?dl=1'

file = pd.ExcelFile(url, parse_date=True, 
       date_parser = (lambda x: pd.to_datetime(x, format ='%d/%m/%y')))

df = file.parse(0)

df
    date    variable
0   2016-01-06  1
1   2016-06-07  2
2   2016-12-10  3
3   2016-12-29  4

这样的事情可能会奏效,但不会:

df = file.parse(0, converters={'date' : lambda x: pd.to_datetime(x, dayfirst=True)}

date    variable
0   2016-01-06  1
1   2016-06-07  2
2   2016-12-10  3
3   2016-12-29  4

【问题讨论】:

  • @Mandy8055 应用pd.to_datetime(df.Date,dayfirst=True)后没有任何反应

标签: python excel pandas date


【解决方案1】:

实际上,pandas 有一种显示日期时间对象的格式。因此,它将以该格式显示,直到您更改它。同时,您可以这样做:

>>> df['date1'] = df['date'].dt.strftime('%d/%m/%y')
          date  variable       date1
0   2016-01-06         1    06/01/16
1   2016-06-07         2    07/06/16
2   2016-12-10         3    10/12/16
3   2016-12-29         4    29/12/16

【讨论】:

    【解决方案2】:

    你可以使用converters:

    >>> file.parse(0, parse_dates=True, index_col=0, date_parser=lambda x: pd.to_datetime(x).strftime("%d/%m/%Y"))
    
         variable
    date    
    2016-06-01  1
    2016-07-06  2
    2016-10-12  3
    2016-12-29  4
    

    【讨论】:

    • 你知道没有变量名怎么办吗?
    • 您应该可以使用0 或该列的索引作为键。所以converters={0: lambda x....}
    • 例如,第一个日期是 1/6/16(2016 年 6 月 1 日),但我得到的是 1 月 6 日,对吧?即使改变格式。
    • 是的,在这种格式下,它将显示为 1 月 6 日。至少对于这些数字,没有办法自动检测它是否错误。一个人甚至不能说他们错了。您必须进入并手动更改它。
    • 在读取 R 中的数据时,我不能强制使用给定的格式吗?
    【解决方案3】:

    您可以将pandas.read_exceldatetime.datetime.strptime 结合使用。

    import pandas as pd
    from datetime import datetime
    
    URL = 'https://www.dropbox.com/s/8gqmq3jx27unsta/example_dates.xlsx?dl=1'
    
    file = (
        pd
        .read_excel(
            io=URL, 
            parse_date=True,
            date_parser=lambda x: datetime.strptime(x, '%d/%m/%Y'),
        )
    )
    

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 2017-02-18
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 2018-07-23
      相关资源
      最近更新 更多