【问题标题】:Convert float64 column to datetime pandas将 float64 列转换为日期时间熊猫
【发布时间】:2017-08-24 07:43:03
【问题描述】:

我有以下pandas DataFramedfA['TradeDate']

0     20100329.0
1     20100328.0
2     20100329.0
...

我希望将其转换为日期时间。

基于 SO 上的另一个步骤,我先将其转换为字符串,然后应用 strptime 函数。

dfA['TradeDate'] = datetime.datetime.strptime( dfA['TradeDate'].astype('int').to_string() ,'%Y%m%d')

但是这会返回我的格式不正确的错误 (ValueError)。

我发现的一个问题是该列不适用于字符串,而是一个对象。

当我尝试时:

dfA['TradeDate'] = datetime.datetime.strptime( dfA['TradeDate'].astype(int).astype(str),'%Y%m%d')

它返回:必须是 Str 而不是 Series。

【问题讨论】:

    标签: python python-3.x pandas datetime dataframe


    【解决方案1】:

    你可以使用:

    df['TradeDate'] = pd.to_datetime(df['TradeDate'], format='%Y%m%d.0')
    print (df)
       TradeDate
    0 2010-03-29
    1 2010-03-28
    2 2010-03-29
    

    但如果有一些不好的值,请添加errors='coerce' 以将它们替换为NaT

    print (df)
        TradeDate
    0  20100329.0
    1  20100328.0
    2  20100329.0
    3  20153030.0
    4         yyy
    
    df['TradeDate'] = pd.to_datetime(df['TradeDate'], format='%Y%m%d.0', errors='coerce')
    print (df)
       TradeDate
    0 2010-03-29
    1 2010-03-28
    2 2010-03-29
    3        NaT
    4        NaT
    

    【讨论】:

    • 它说:DataFrame has no attribute to_datetime??
    • 可能是拼写错误 pd.to_datetime 不是 df.to_datetime
    【解决方案2】:

    您可以在值的字符串表示上使用to_datetime 和自定义格式:

    import pandas as pd
    pd.to_datetime(pd.Series([20100329.0, 20100328.0, 20100329.0]).astype(str), format='%Y%m%d.0')
    

    【讨论】:

    • 它说:DataFrame 没有属性 to_datetime
    • pdimport pandas as pd
    • 也许您已经创建了一个名为 pd 的数据框,它隐藏了实际的 pandas 模块?
    【解决方案3】:

    strptime 函数适用于单个值,而不适用于系列。您需要将该函数应用于列的每个元素

    试试pandas.to_datetime方法

    例如

    dfA = pandas.DataFrame({"TradeDate" : [20100329.0,20100328.0]})
    pandas.to_datetime(dfA['TradeDate'], format = "%Y%m%d")
    

    dfA['TradeDate'].astype(int).astype(str)\ 
        .apply(lambda x:datetime.datetime.strptime(x,'%Y%m%d'))
    

    【讨论】:

      【解决方案4】:

      在您的第一次尝试中,您尝试将其转换为字符串,然后传递给strptime,结果为ValueError。这是因为dfA['TradeDate'].astype('int').to_string() 创建了一个包含所有 日期及其行号的字符串。您可以将其更改为

      dates = dfA['TradeDate'].astype('int').to_string(index=False).split()
      dates
      [u'20100329.0', u'20100328.0', u'20100329.0']
      

      获取日期列表。然后使用python list comprehension将每个元素转换为datetime

      dfA['TradeDate'] = [datetime.strptime(x, '%Y%m%d.0') for x in dates]
      

      【讨论】:

        猜你喜欢
        • 2018-12-08
        • 1970-01-01
        • 2019-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多