代码之家  ›  专栏  ›  技术社区  ›  ALollz

为什么pd.to\u datetime会根据是否指定了格式而使用不同的默认Y/M/D

  •  2
  • ALollz  · 技术社区  · 3 年前

    这是一个有点奇怪的用例,但是当用 pd.to_datetime

    pd.to_datetime('02:12:11', format='%H:%M:%S')
    #Timestamp('1900-01-01 02:12:11')
    
    pd.to_datetime('02:12:11')
    #Timestamp('2021-03-17 02:12:11')
    

    我以为 1900-01-01T00:00:00.000 将用于填充所有情况下缺失的组件,符合 datetime Technical Detail ,(熊猫文档链接的内容)但不知何故它决定使用 'today' 获取没有格式的其他组件。

    这是记录在案的地方还是预期的行为?

    0 回复  |  直到 3 年前
        1
  •  2
  •   Umar.H    3 年前

    如果我正确理解源代码,如果没有 datetime.datetime 对象传递给 objects_to_datetime64ns 则默认为 datetime.now 除非你指定格式。

    python3.8 > site-packages > dateutil > parser._parser.py

    使用 pd.to_datetime('01:04:06') 举个例子。

    if parserinfo:
        return parser(parserinfo).parse(timestr, **kwargs)
    else:
        return DEFAULTPARSER.parse(timestr, **kwargs)
    

    enter image description here

    enter image description here

    # the line of code in question. 
    if default is None:
            default = datetime.datetime.now().replace(hour=0, minute=0,
                                                      second=0, microsecond=0)
    

    从我的理解来看 datetime.datetime(2021, 3, 17, 1, 4, 6)

    result, tz_parsed = tslib.array_to_datetime(
                data,
                errors=errors,
                utc=utc,
                dayfirst=dayfirst,
                yearfirst=yearfirst,
                require_iso8601=require_iso8601,
            )
    

    返回datetime对象。

    如果这是一个预期的行为,我会敦促是的一方,因为代码是以这样的方式编写的,但是在文档中明确之前,我不会给出绝对的确定性,因为pandas依赖于标准python lib进行这种转换。

    enter image description here

        2
  •  2
  •   Irv    3 年前

    pandas依赖于其他库来进行解析,包括python的datetime库和dateutil包。

    import pandas as pd
    from datetime import datetime as dt
    from dateutil import parser
    
    print("pandas datetime with format ",pd.to_datetime('02:12:11', format='%H:%M:%S'))
    print("datetime with format ", dt.strptime('02:12:11', '%H:%M:%S'))
    
    print("pandas datetime without format ", pd.to_datetime('02:12:11'))
    
    print("dateutil parser without format ", parser.parse('02:12:11'))
    

    生产

    pandas datetime with format  1900-01-01 02:12:11
    datetime with format  1900-01-01 02:12:11
    pandas datetime without format  2021-03-17 02:12:11
    dateutil parser without format  2021-03-17 02:12:11
    

    所以这里的问题是 dateutil strptime() 使用Unix源。