Python 熊猫:将数据框中的日期更改为相同的日期格式

Python 熊猫:将数据框中的日期更改为相同的日期格式,python,pandas,Python,Pandas,我有一个数据框,其中包含一列,其中包含: Date: 31MAR2005 30-06-05 311205 我想将这些日期转换为格式:30-06-05(DD-MM-JJ)。最简单的方法是什么?这些字段尚未采用日期格式,仅为字符串。您可以使用这些字段从每个日期字符串中提取日期、月份和年份: import pandas as pd df = pd.DataFrame(['31MAR2005', '30-06-05', '311205'], columns=['Date']) tmp = df['D

我有一个数据框,其中包含一列,其中包含:

Date:
31MAR2005
30-06-05
311205
我想将这些日期转换为格式:30-06-05(DD-MM-JJ)。最简单的方法是什么?这些字段尚未采用日期格式,仅为字符串。

您可以使用这些字段从每个日期字符串中提取日期、月份和年份:

import pandas as pd

df = pd.DataFrame(['31MAR2005', '30-06-05', '311205'], columns=['Date'])
tmp = df['Date'].str.extract(r'(\d{2})-?(\D{3}|\d{2})-?.*(\d{2})')
tmp.columns = ['day', 'month', 'year']
屈服

In [228]: tmp
Out[228]: 
  day month year
0  31   MAR   05
1  30    06   05
2  31    12   05
In [230]: tmp
Out[230]: 
  day month year
0  31    03   05
1  30    06   05
2  31    12   05
In [232]: df
Out[232]: 
       Date
0  31-03-05
1  30-06-05
2  31-12-05
现在,通过调用
Series.map
,您可以将3个字母的月份缩写更改为数字字符串:

import calendar
monthmap = {calendar.month_abbr[i].upper(): '{:02d}'.format(i) for i in range(1, 13)}
monthmap.update({'{:02d}'.format(i):'{:02d}'.format(i) for i in range(1, 13)})
tmp['month'] = tmp['month'].map(monthmap)
屈服

In [228]: tmp
Out[228]: 
  day month year
0  31   MAR   05
1  30    06   05
2  31    12   05
In [230]: tmp
Out[230]: 
  day month year
0  31    03   05
1  30    06   05
2  31    12   05
In [232]: df
Out[232]: 
       Date
0  31-03-05
1  30-06-05
2  31-12-05
最后,您可以将
df['Date']
重新分配到所需的日期字符串格式:

df['Date'] = tmp['day']+'-'+tmp['month']+'-'+tmp['year']
屈服

In [228]: tmp
Out[228]: 
  day month year
0  31   MAR   05
1  30    06   05
2  31    12   05
In [230]: tmp
Out[230]: 
  day month year
0  31    03   05
1  30    06   05
2  31    12   05
In [232]: df
Out[232]: 
       Date
0  31-03-05
1  30-06-05
2  31-12-05
特别是如果数据帧很长, 使用矢量化字符串方法应该比使用
df更快。应用
为每行值调用一次Python函数

还要注意的是,这在不解析字符串的情况下完成了任务 时间戳。这可能是好事,也可能是坏事。 一方面,它可以提高性能。在…上 另一方面,它可能允许无效的日期字符串(例如
'30FEB2005'
)通过

重新格式化字符串后,可以调用

df['Date'] = pd.to_datetime(df['Date'])
要将日期字符串转换为正确的
时间戳
。然后无效的日期字符串将变成
NaT
(非时间戳)值。

以下是我的示例:

def string_to_date(my_string):
    if '-' in my_string:
        return datetime.datetime.strptime(my_string, '%d-%m-%y')
    elif my_string.isdigit():
        return datetime.datetime.strptime(my_string, '%d%m%y')
    elif my_string.isalnum():
        return datetime.datetime.strptime(my_string, '%d%b%Y')
现在我正在您的数据帧df上测试它:

In[116]: df['Date:'].apply(lambda x: string_to_date(x))
Out[114]: 
0   2005-03-31
1   2005-06-30
2   2005-12-31
Name: Date:, dtype: datetime64[ns]

这是字符串的三种模式吗?或者有更多的模式(也许有些你甚至没有意识到?)?其次,如果有常见的模式,您知道这些模式将出现在哪些行吗?@measureallethings,这三种模式是本专栏中唯一存在的模式。我不知道它们出现的具体行。如果这是仅有的3种模式,我建议使用一些字符串识别和strtime创建一个函数,然后将其应用于数据帧。@Alex听起来很有帮助,但是你能给我一个代码示例吗?这里有一个示例:这有点不同,它在函数
match()
中搜索一个特定的模式,但是如果你添加一些逻辑来搜索这里显示的三个模式,它应该适合你的情况。