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

2024-04-25 22:58:16 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题类似于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

如何在熊猫身上做到这一点?你知道吗

注:如果缺少日期,则考虑1日,如果缺少月份,则考虑1月。你知道吗


Tags: 数据answer排序格式解决方案this用例oct
2条回答

可复制设置(用于简单的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.applydf.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

simpler应该只省略applyreset_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

相关问题 更多 >

    热门问题