【问题标题】:Pandas - converting out of order string date timePandas - 转换乱序字符串日期时间
【发布时间】:2020-03-16 00:56:28
【问题描述】:

我有一个 DataFrame 列,其中包含日期/时间的字符串值(输入数据)。我需要将其转换为半时间戳格式(所需的输出数据)。有些行是空白的,需要保持空白。我使用引号用于说明目的。我正在使用strptime,但出现错误(见下文)。

输入数据(字符串):

Mar 8 12:00 PM  2020
'                   '
Mar 8  1:00 PM  2020
Mar 8  6:00 PM  2020
Mar 9  8:00 AM  2020

所需的输出数据:

3/8/2020 12:00:00
'                '
3/8/2020 13:00:00
3/8/2020 18:00:00
3/9/2020 08:00:00

代码:

import datetime as dt
df['date'].apply(lambda x: dt.datetime.strptime(x, '%b %d %H:%M %p  %Y'))  

错误:

ValueError: time data '' does not match format '%b %d %H:%M %p %Y'

如何重写此代码以获得所需的输出?

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    对我来说,to_datetime 的格式与您的 %I 类似,用于选择 12 小时格式的时间,如果某些值不匹配,也会添加 errors='coerce' 用于缺失值 (NaT):

    df['date'] = pd.to_datetime(df['date'], format='%b %d %I:%M %p  %Y', errors='coerce')
    print (df)
                     date
    0 2020-03-08 12:00:00
    1                 NaT
    2 2020-03-08 13:00:00
    3 2020-03-08 18:00:00
    4 2020-03-09 08:00:00
    

    自定义格式的最后一个使用Series.dt.strftimeSeries.replace

    df['date'] = (pd.to_datetime(df['date'], format='%b %d %I:%M %p  %Y', errors='coerce')
                    .dt.strftime('%m/%d/%y %H:%M:%S')
                    .replace('NaT', ''))
    
    print (df)
                    date
    0  03/08/20 12:00:00
    1                   
    2  03/08/20 13:00:00
    3  03/08/20 18:00:00
    4  03/09/20 08:00:00
    

    或者将多个空格替换为一个空格:

    df['date'] = (pd.to_datetime(df['date'].replace('\s+', ' ', regex=True), format='%b %d %I:%M %p %Y', errors='coerce')
                    .dt.strftime('%m/%d/%y %H:%M:%S')
                    .replace('NaT', ''))
    
    print (df)
                    date
    0  03/08/20 12:00:00
    1                   
    2  03/08/20 13:00:00
    3  03/08/20 18:00:00
    4  03/09/20 08:00:00
    

    【讨论】:

    • 问题是有空格的行。因此它需要跳过它们并将其仅应用于非空白行。我将编辑问题以在输入数据中显示空白。
    • @user3062459 - 如果添加 errors='coerce' 那么它适用于所有数据,因为空白是创建缺失值
    • 这是我使用errors='coerce' 0 NaT 1 NaT 2 NaT 3 NaT 4 NaT 93 NaT 时的输出
    • @user3062459 - 数据中的空格是否正确使用? %b %d %I:%M %p %Y - 在%p%Y 之间有2 spaces
    • 我想通了。我必须先这样做才能使您的代码正常工作:df['date'] = df['date'].astype(str) df['date'] = df['date'].str.strip()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 2019-01-05
    • 2019-03-10
    • 1970-01-01
    • 2015-09-17
    相关资源
    最近更新 更多