【问题标题】:Convert DataFrame column type from string to datetime将 DataFrame 列类型从字符串转换为日期时间
【发布时间】:2013-06-12 15:37:39
【问题描述】:

如何将 DataFrame 的字符串列(dd/mm/yyyy 格式)转换为日期时间?

【问题讨论】:

    标签: python pandas dataframe datetime-format python-datetime


    【解决方案1】:

    最简单的方法是使用to_datetime

    df['col'] = pd.to_datetime(df['col'])
    

    它还为欧洲时代提供了 dayfirst 参数(但请注意 this isn't strict)。

    它在行动:

    In [11]: pd.to_datetime(pd.Series(['05/23/2005']))
    Out[11]:
    0   2005-05-23 00:00:00
    dtype: datetime64[ns]
    

    你可以传递一个具体的format

    In [12]: pd.to_datetime(pd.Series(['05/23/2005']), format="%m/%d/%Y")
    Out[12]:
    0   2005-05-23
    dtype: datetime64[ns]
    

    【讨论】:

    • 感谢您的重播,我可以定义它的格式吗?像 '%d/%m/%Y' ?非常感谢
    • @shootingstars 可能会看到stackoverflow.com/questions/13703720/…
    • @shootingstars 传递数组DatetimeIndex(df['col']).to_pydatetime() 应该可以工作。
    • Nvm,我评论太早了。搜索SettingWithCopyWarning 提供了足够的材料
    • @daneshjai 双大括号生成一个 DataFrame(只有一列),而单大括号将列作为一个系列。
    【解决方案2】:

    如果您的日期列是格式为“2017-01-01”的字符串 您可以使用 pandas astype 将其转换为日期时间。

    df['date'] = df['date'].astype('datetime64[ns]')

    如果您想要日精度而不是纳秒,请使用 datetime64[D]

    print(type(df_launath['date'].iloc[0]))

    产量

    <class 'pandas._libs.tslib.Timestamp'> 与使用 pandas.to_datetime 时相同

    您可以尝试使用其他格式,然后是 '%Y-%m-%d',但至少可以。

    【讨论】:

      【解决方案3】:

      如果您想指定棘手的格式,可以使用以下内容:

      df['date_col'] =  pd.to_datetime(df['date_col'], format='%d/%m/%Y')
      

      更多关于format的细节在这里:

      【讨论】:

        【解决方案4】:

        如果您的日期中有多种格式,请不要忘记设置infer_datetime_format=True 以使生活更轻松。

        df['date'] = pd.to_datetime(df['date'], infer_datetime_format=True)

        来源:pd.to_datetime

        或者如果您想要定制的方法:

        def autoconvert_datetime(value):
            formats = ['%m/%d/%Y', '%m-%d-%y']  # formats to try
            result_format = '%d-%m-%Y'  # output format
            for dt_format in formats:
                try:
                    dt_obj = datetime.strptime(value, dt_format)
                    return dt_obj.strftime(result_format)
                except Exception as e:  # throws exception when format doesn't match
                    pass
            return value  # let it be if it doesn't match
        
        df['date'] = df['date'].apply(autoconvert_datetime)
        

        【讨论】:

        • 可以使用自定义方法,而无需求助于没有快速缓存的.apply,并且在转换十亿个值时会很困难。 col = pd.concat([pd.to_datetime(col, errors='coerce', format=f) for f in formats], axis='columns').bfill(axis='columns').iloc[:, 0] 是另一种选择,但不是很好
        • 如果您有多种格式,则不应使用infer_datetime_format=True,因为这假定为单一格式。跳过这个论点。要了解原因,请尝试使用pd.to_datetime(pd.Series(['1/5/2015 8:08:00 AM', '1/4/2015 11:24:00 PM']), infer_datetime_format=True) 和不使用errors='coerce'。见this issue
        猜你喜欢
        • 2020-09-06
        • 2023-04-04
        • 2011-05-17
        • 1970-01-01
        • 2015-04-25
        • 2023-01-27
        相关资源
        最近更新 更多