【问题标题】:Translating a messy date string in a DataFrame to `datetime` in python and pandas将 DataFrame 中凌乱的日期字符串转换为 python 和 pandas 中的“datetime”
【发布时间】:2019-11-30 22:52:34
【问题描述】:

我有一个以多种格式列出日期的数据框。例如:

       date
201    July 17,2019
555    06-06-2019
295    28/3/2019

有没有办法将所有这些日期转换为datetime

【问题讨论】:

    标签: python pandas date datetime


    【解决方案1】:

    查看下方Edit 以获得更好的答案。

    通常对于这样的任务,您会使用pandas.Series.dt.strftime() 将整个列转换为特定的DateTime 格式,但由于您似乎在不同的行中有不同的格式,您可能应该改为查看datetime.strptime()

    遍历Date 的那一列,通过if(或try)语句更改日期(伪代码用于演示):

    for date in date_column:
        if "," in date:
            # strptime()
        elif "-" in date:
            # strptime()
        elif "/" in date:
            dt = datetime.strptime(date, "%d/%m/%y")
    
        column_row = dt
    

    Herestrftime() 格式代码,您需要设置函数的第二个参数。


    编辑

    您也可以使用dateutil.parser.parse 来执行此操作(请务必先通过pip install python-dateutil 安装它):

    from dateutil.parser import parse
    
    df['date'] = df.date.apply(parse)
    

    例如:

    from dateutil.parser import parse
    import pandas as pd
    import numpy as np
    
    
    def parse_date(date):
        if date is np.nan:
            return np.nan
        else:
            return parse(date)
    
    
    df = pd.DataFrame(
        {
            "date": [
                "July 17,2019",
                "06-06-2019",
                "28/3/2019",
                "12/3/19",
                "31-12-19",
                np.nan,
            ],
            "text": ["t1", "t2", "t3", "t4", "t5", "t6"],
        }
    )
    
    df["date"] = df.date.apply(parse_date)
    

    转换:

               date text
    0  July 17,2019   t1
    1    06-06-2019   t2
    2     28/3/2019   t3
    3       12/3/19   t4
    4      31-12-19   t5
    5           NaN   t6
    

            date text
    0 2019-07-17   t1
    1 2019-06-06   t2
    2 2019-03-28   t3
    3 2019-12-03   t4
    4 2019-12-31   t5
    5        NaT   t6
    

    您也可以通过使用lambda 表达式来完成与函数相同的操作,如下所示:

    df["date"] = df.date.apply(lambda date: np.nan if date is np.nan else parse(date))
    

    【讨论】:

    • 您的意思是date 而不是column_row? (顺便说一句,感谢这个极好的建议。)
    • 还有一个问题:有些日期列为 15/2/2019,而其他日期列为 12/2/19。有没有办法抓住它们?
    • 我已经利用@oppressionslayer 答案以及dateutil 的想法更新了上面的答案,这是一个强大的Python 模块,可以满足您的需求。
    • 我运行了这个,我得到了 '('Unknown string format:', 'nan')'。那是因为有些日期是 nan。
    • 我在数据框中发现了错误的日期。它没有一年。感谢您的所有帮助。
    【解决方案2】:

    我会创建一个应用函数来检查正则表达式,并根据该正则表达式返回日期时间,运行 if/elif 命令列表并返回结果,例如:

    def checkdate(x):
       if pd.Series(x).str.contains(r'\w+ \d+,\d+')[0]: 
         return datetime.datetime.strptime(x, '%B %d,%Y') 
       #elif next str.contains, etc
       else:
         return np.nan
    
    df.date.apply(checkdate) 
    

    采样

    0   2019-07-17
    1          NaT
    2          NaT
    

    然后您可以使用 df = df.date.apply(checkdate) 将日期列重置为这些值

    【讨论】:

    • df.col.apply 的精彩使用。通过添加此内容更新了我的答案,但使用了dateutil。 +1
    猜你喜欢
    • 2021-08-21
    • 2019-03-10
    • 2013-11-13
    • 2013-06-09
    • 2020-04-12
    • 2013-05-04
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多