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

ValueError:时间数据“10/11/2006 24:00”与格式“%d/%m/%Y%H:%m”不匹配

  •  1
  • ScalaBoy  · 技术社区  · 6 年前

    df["datetime_obj"] = df["datetime"].apply(lambda dt: datetime.strptime(dt, "%d/%m/%Y %H:%M"))
    

    但有个错误:

    “%d/%m/%Y%H:%m”

    如何正确解决?

    3 回复  |  直到 6 年前
        1
  •  1
  •   willeM_ Van Onsem    6 年前

    这不起作用的原因是 %H 参数只接受以下范围内的值 00 23 (包括两者)。这意味着 24:00 正如错误所说,不是有效的时间字符串。

    因此,我认为除了将字符串转换为有效格式之外,我们没有太多其他选择。我们可以先替换 24:00 具有 00:00

    比如:

    from datetime import timedelta
    import pandas as pd
    
    df['datetime_zero'] = df['datetime'].str.replace('24:00', '0:00')
    df['datetime_er'] = pd.to_datetime(df['datetime_zero'], format='%d/%m/%Y %H:%M')
    selrow = df['datetime'].str.contains('24:00')
    df['datetime_obj'] = df['datetime_er'] + selrow * timedelta(days=1)
    

    因此,最后一行向包含 24:00 ,以便 '10/11/2006 24:00' '11/11/2006 24:00' 不安全的 datetime s也有秒,过滤器可能会被触发 00:24:00 ,所以它可能需要一些额外的工作才能正常工作。

        2
  •  1
  •   jpp    6 年前

    datetime 物体。应该只有一种方法来存储特定的 ,即。 '10/11/2006 24:00' 应该重写为 '11/11/2006 00:00'

    有一种方法可以解决这个问题:

    # find datetimes which have '24:00' and rewrite
    twenty_fours = df['strings'].str[-5:] == '24:00'
    df.loc[twenty_fours, 'strings'] = df['strings'].str[:-5] + '00:00'
    
    # construct datetime series
    df['datetime'] = pd.to_datetime(df['strings'], format='%d/%m/%Y %H:%M')
    
    # add one day where applicable
    df.loc[twenty_fours, 'datetime'] += pd.DateOffset(1)
    

    dateList = ['10/11/2006 24:00', '11/11/2006 00:00', '12/11/2006 15:00']
    df = pd.DataFrame({'strings': dateList})
    

    上述转换后的结果:

    print(df['datetime'])
    
    0   2006-11-11 00:00:00
    1   2006-11-11 00:00:00
    2   2006-11-12 15:00:00
    Name: datetime, dtype: datetime64[ns]
    
        3
  •  0
  •   Matthieu Brucher    6 年前

    如文件所示( https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior ),小时从00到23。24:00是一个错误。