代码之家  ›  专栏  ›  技术社区  ›  cs95 abhishek58g

从文件中读取不同格式的日期并对其排序

  •  1
  • cs95 abhishek58g  · 技术社区  · 8 年前

    这个问题类似于 this answer 对于稍有不同的用例会很有用,所以我把它贴在这里。


    给定文本文件:

    04/20/2009; 04/20/09; 4/20/09; 4/3/09
    Mar-20-2009; Mar 20, 2009; March 20, 2009; Mar. 20, 2009; Mar 20 2009;
    20 Mar 2009; 20 March 2009; 20 Mar. 2009; 20 March, 2009
    Mar 20th, 2009; Mar 21st, 2009; Mar 22nd, 2009
    Feb 2009; Sep 2009; Oct 2010
    6/2008; 12/2009
    2009; 2010
    

    包含不同格式的已提取日期。。。任务是将它们读入数据帧,然后对其进行排序,然后以MM/DD/YYYY格式显示输出。

    预期输出:

    0     06/01/2008
    1     01/01/2009
    2     02/01/2009
    3     03/20/2009
    4     03/20/2009
    5     03/20/2009
    6     03/20/2009
    7     03/20/2009
    8     03/20/2009
    9     03/20/2009
    10    03/20/2009
    11    03/20/2009
    12    03/20/2009
    13    03/21/2009
    14    03/22/2009
    15    04/03/2009
    16    04/20/2009
    17    04/20/2009
    18    04/20/2009
    19    09/01/2009
    20    12/01/2009
    21    01/01/2010
    22    10/01/2010
    

    如何在熊猫身上做到这一点?

    2 回复  |  直到 8 年前
        1
  •  2
  •   jezrael    8 年前

    更简单的应该省略 apply reset_index 只有一次:

    在我看来 drop=1 更糟糕的是 drop=True

    out = pd.to_datetime(df.stack()).sort_values().dt.strftime('%m/%d/%Y').reset_index(drop=True)
    print(out)
    0     06/01/2008
    1     01/01/2009
    2     02/01/2009
    3     03/20/2009
    4     03/20/2009
    5     03/20/2009
    6     03/20/2009
    7     03/20/2009
    8     03/20/2009
    9     03/20/2009
    10    03/20/2009
    11    03/20/2009
    12    03/20/2009
    13    03/21/2009
    14    03/22/2009
    15    04/03/2009
    16    04/20/2009
    17    04/20/2009
    18    04/20/2009
    19    09/01/2009
    20    12/01/2009
    21    01/01/2010
    22    10/01/2010
    dtype: object
    
        2
  •  2
  •   cs95 abhishek58g    8 年前

    可复制设置(用于简单的MCVE):

    import pandas as pd
    import io
    
    text = '''04/20/2009; 04/20/09; 4/20/09; 4/3/09
    Mar-20-2009; Mar 20, 2009; March 20, 2009; Mar. 20, 2009; Mar 20 2009;
    20 Mar 2009; 20 March 2009; 20 Mar. 2009; 20 March, 2009
    Mar 20th, 2009; Mar 21st, 2009; Mar 22nd, 2009
    Feb 2009; Sep 2009; Oct 2010
    6/2008; 12/2009
    2009; 2010'''
    
    buf = io.stringIO(text)
    
    df = pd.read_csv(buf, engine='python', delimiter=';\s+', header=None).reset_index()
    
    df
    
                index               0               1               2  \
    0      04/20/2009        04/20/09         4/20/09          4/3/09   
    1     Mar-20-2009    Mar 20, 2009  March 20, 2009   Mar. 20, 2009   
    2     20 Mar 2009   20 March 2009    20 Mar. 2009  20 March, 2009   
    3  Mar 20th, 2009  Mar 21st, 2009  Mar 22nd, 2009            None   
    4        Feb 2009        Sep 2009        Oct 2010            None   
    5          6/2008         12/2009            None            None   
    6            2009            2010            None            None   
    
                  3  
    0          None  
    1  Mar 20 2009;  
    2          None  
    3          None  
    4          None  
    5          None  
    6          None 
    

    代替 buf 使用文本文件的名称。


    您可以使用 df.apply df.stack pd.Series.sort_values

    out = df.stack().apply(pd.to_datetime)\
            .reset_index(drop=1)\
            .sort_values().dt.strftime('%m/%d/%Y')\
            .reset_index(drop=1)
    print(out)
    
    0     06/01/2008
    1     01/01/2009
    2     02/01/2009
    3     03/20/2009
    4     03/20/2009
    5     03/20/2009
    6     03/20/2009
    7     03/20/2009
    8     03/20/2009
    9     03/20/2009
    10    03/20/2009
    11    03/20/2009
    12    03/20/2009
    13    03/21/2009
    14    03/22/2009
    15    04/03/2009
    16    04/20/2009
    17    04/20/2009
    18    04/20/2009
    19    09/01/2009
    20    12/01/2009
    21    01/01/2010
    22    10/01/2010