【问题标题】:Convert Column to Date Format (Pandas Dataframe)将列转换为日期格式(熊猫数据框)
【发布时间】:2015-03-25 12:42:03
【问题描述】:

我有一个熊猫数据框如下:

Symbol  Date
A       02/20/2015
A       01/15/2016
A       08/21/2015

我想按Date 对其进行排序,但该列只是object

我尝试将列设为日期对象,但遇到了一个问题,即该格式不是所需的格式。所需格式为2015-02-20, 等。

所以现在我想弄清楚如何让 numpy 将“美国”日期转换为 ISO 标准,以便我可以将它们设为日期对象,以便按它们排序。

如何将这些美国日期转换为 ISO 标准,或者我在 pandas 中缺少更直接的方法?

【问题讨论】:

    标签: python pandas


    【解决方案1】:
    data['Date'] = data['Date'].apply(pd.to_datetime) # non-null datetime64[ns]
    

    【讨论】:

    • 欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
    【解决方案2】:

    因为 pandas >= 1.0.0 我们在 DataFrame.sort_values 中有 key 参数。这样我们就可以通过指定一个键对数据帧进行排序,而无需调整原始数据帧:

    df.sort_values(by="Date", key=pd.to_datetime)
    
      Symbol        Date
    0      A  02/20/2015
    2      A  08/21/2015
    1      A  01/15/2016
    

    【讨论】:

    • 谢谢大佬,准确又快速
    【解决方案3】:

    可以使用以下代码读取包含日期列的数据:

    data = pd.csv(file_path,parse_dates=[date_column])
    

    使用上述代码行读取数据后,可以使用pd.date_time() 访问包含有关日期信息的列,例如:

    pd.date_time(data[date_column], format = '%d/%m/%y')
    

    根据需要更改日期格式。

    【讨论】:

      【解决方案4】:

      sort 方法已被 deprecated 替换为 sort_values。使用df['Date']=pd.to_datetime(df['Date'])转换为日期时间对象后

      df.sort_values(by=['Date'])
      

      注意:就地和/或按降序排序(最近的在前):

      df.sort_values(by=['Date'], inplace=True, ascending=False)
      

      【讨论】:

      • 我建议你使用它:df.sort_values(by=['Date'])
      • 我绞尽脑汁想知道为什么我的排序中有重复。 inplace=True 解决了这个问题。非常感谢!
      【解决方案5】:

      @JAB's answer 快速简洁。但它会更改您尝试排序的DataFrame,您可能想要也可能不想要。

      注意:您几乎肯定想要它,因为您的日期列应该是日期,而不是字符串!)

      万一您不想将日期更改为日期,也可以采用其他方式。

      首先,从已排序的Date 列中获取索引:

      In [25]: pd.to_datetime(df.Date).order().index
      Out[25]: Int64Index([0, 2, 1], dtype='int64')
      

      然后用它来索引你原来的DataFrame,保持原样:

      In [26]: df.ix[pd.to_datetime(df.Date).order().index]
      Out[26]: 
              Date Symbol
      0 2015-02-20      A
      2 2015-08-21      A
      1 2016-01-15      A
      

      魔法!

      注意:对于 Pandas 0.20.0 及更高版本,请使用 loc 而不是现在已弃用的 ix

      【讨论】:

        【解决方案6】:

        您可以使用pd.to_datetime() 转换为日期时间对象。它需要一个格式参数,但在你的情况下,我认为你不需要它。

        >>> import pandas as pd
        >>> df = pd.DataFrame( {'Symbol':['A','A','A'] ,
            'Date':['02/20/2015','01/15/2016','08/21/2015']})
        >>> df
                 Date Symbol
        0  02/20/2015      A
        1  01/15/2016      A
        2  08/21/2015      A
        >>> df['Date'] =pd.to_datetime(df.Date)
        >>> df.sort('Date') # This now sorts in date order
                Date Symbol
        0 2015-02-20      A
        2 2015-08-21      A
        1 2016-01-15      A
        

        为了以后的搜索,你可以改变排序语句:

        >>> df.sort_values(by='Date') # This now sorts in date order
                Date Symbol
        0 2015-02-20      A
        2 2015-08-21      A
        1 2016-01-15      A
        

        【讨论】:

        • 我在排序之前还有一个 df['Date'].unique() ,它返回一个系列而不是一个数据框。这使得 02/20/2015 变为 2015-02-19T18:00:00.000000000-0600,然后拆分为 2015-02-19。有没有办法增加一天?或者更正式的方式来纠正这个问题?
        • df.Date.astype(np.int64) 应该适用于纪元时间
        • 原来那个时代是错误的,因为它假设时间是 18:00 小时等。我需要它们是 00:00 小时。如果我可以让日期对象没有时间或错误的时间,我有办法转换为纪元。
        • 对我来说pd.to_datetime(df.Date)[0] 返回Timestamp('2015-02-20 00:00:00')
        • 用更正式的问题描述开始新问题
        猜你喜欢
        • 2020-03-30
        • 2019-01-20
        • 1970-01-01
        • 1970-01-01
        • 2014-02-23
        • 2020-11-12
        • 2019-10-12
        • 2019-05-22
        • 1970-01-01
        相关资源
        最近更新 更多