Python 在dataframe中处理多种日期格式

Python 在dataframe中处理多种日期格式,python,python-3.x,pandas,Python,Python 3.x,Pandas,我从Excel导入了一个数据框,如下所示: Date Period 0 2017-03-02 2017-03-01 00:00:00 1 2017-03-02 2017-04-01 00:00:00 2 2017-03-02 2017-05-01 00:00:00 3 2017-03-02 2017-06-01 00:00:00 4 2017-03-02 2017-07-01 00:00:00

我从Excel导入了一个数据框,如下所示:

         Date               Period  
0  2017-03-02  2017-03-01 00:00:00  
1  2017-03-02  2017-04-01 00:00:00     
2  2017-03-02  2017-05-01 00:00:00    
3  2017-03-02  2017-06-01 00:00:00    
4  2017-03-02  2017-07-01 00:00:00      
5  2017-03-02  2017-08-01 00:00:00   
6  2017-03-02  2017-09-01 00:00:00    
7  2017-03-02  2017-10-01 00:00:00  
8  2017-03-02  2017-11-01 00:00:00 
9  2017-03-02  2017-12-01 00:00:00 
10 2017-03-02                 Q217 
11 2017-03-02                 Q317  
12 2017-03-02                 Q417 
13 2017-03-02                 Q118 
14 2017-03-02                 Q218 
15 2017-03-02                 Q318 
16 2017-03-02                 Q418 
17 2017-03-02                 2018   
mask = df['Period'].str.startswith('Q', na = False)
list_quarter = df_final[mask]['Period'].tolist()
quarter_convert = {'1':'31/03', '2':'30/06', '3':'31/08', '4':'30/12'}
counter = 0
for element in list_quarter:
    element = element[1:]
    quarter = element[0]
    year = element[1:]
    daymonth = ''.join(str(quarter_convert.get(word, word)) for word in quarter)
    final = daymonth+'/'+year
    list_quarter[counter] = final
    counter+=1
我正在尝试将所有“Period”列转换为一致的格式。一些元素看起来已经是datetime格式,其他元素转换为字符串例如Q217,其他元素转换为int ex 2018。在datetime中转换所有内容的最快方法是什么?我试着用一些遮罩,像这样:

         Date               Period  
0  2017-03-02  2017-03-01 00:00:00  
1  2017-03-02  2017-04-01 00:00:00     
2  2017-03-02  2017-05-01 00:00:00    
3  2017-03-02  2017-06-01 00:00:00    
4  2017-03-02  2017-07-01 00:00:00      
5  2017-03-02  2017-08-01 00:00:00   
6  2017-03-02  2017-09-01 00:00:00    
7  2017-03-02  2017-10-01 00:00:00  
8  2017-03-02  2017-11-01 00:00:00 
9  2017-03-02  2017-12-01 00:00:00 
10 2017-03-02                 Q217 
11 2017-03-02                 Q317  
12 2017-03-02                 Q417 
13 2017-03-02                 Q118 
14 2017-03-02                 Q218 
15 2017-03-02                 Q318 
16 2017-03-02                 Q418 
17 2017-03-02                 2018   
mask = df['Period'].str.startswith('Q', na = False)
list_quarter = df_final[mask]['Period'].tolist()
quarter_convert = {'1':'31/03', '2':'30/06', '3':'31/08', '4':'30/12'}
counter = 0
for element in list_quarter:
    element = element[1:]
    quarter = element[0]
    year = element[1:]
    daymonth = ''.join(str(quarter_convert.get(word, word)) for word in quarter)
    final = daymonth+'/'+year
    list_quarter[counter] = final
    counter+=1
但是,当我尝试替换原始列中修改的元素时,它失败了:

df_nwe_final['Period'] = np.where(mask, pd.Series(list_quarter), df_nwe_final['Period'])

当然,我需要对2018类型格式做或多或少的相同操作。然而,我确信我在这里遗漏了一些东西,应该有一个更快的解决方案。你的一些新想法会有帮助的!谢谢。

重复使用您展示的代码,让我们首先编写一个函数,将Q字符串转换为我调整为最终格式的日期时间格式:

def convert_q_string(element):
    quarter_convert = {'1':'03-31', '2':'06-30', '3':'08-31', '4':'12-30'}
    element = element[1:]
    quarter = element[0]
    year = element[1:]
    daymonth = ''.join(str(quarter_convert.get(word, word)) for word in quarter)
    final = '20' + year + '-' + daymonth
    return final
现在,我们可以使用它首先转换所有“Q”字符串,然后使用pd.to_datetime将所有元素转换为正确的日期时间值:

In [2]: s = pd.Series(['2017-03-01 00:00:00', 'Q217', '2018'])

In [3]: mask = s.str.startswith('Q')

In [4]: s[mask] = s[mask].map(convert_q_string)

In [5]: s
Out[5]: 
0    2017-03-01 00:00:00
1             2017-06-30
2                   2018
dtype: object

In [6]: pd.to_datetime(s)
Out[6]: 
0   2017-03-01
1   2017-06-30
2   2018-01-01
dtype: datetime64[ns]

不要使用imgur!复制并粘贴有问题的数据帧。你是对的。修好了!它失败了-它是如何失败的?这是一个形状问题,因为df_nwe_final['Period']的元素比pd.Serieslist_quarter多,这是因为以前的maskingWorks很好,但由于某些原因,当我执行pd.to_datetime时,我得到了一个错误:返回了一个带有错误集的结果。可能是因为2017-03-01 00:00:00在我的数据帧上已经是datetime格式吗?不,混合字符串和datetime在混合时应该不会有问题,它们会逐个解析。你能举一个可复制的例子吗?我在这里,很抱歉回答晚了。不管怎样,我的Python和Pandas安装/旧版本的Pandas出现了一些问题。重新安装的一切,现在它的工作良好!非常感谢。