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()
中搜索一个特定的模式,但是如果你添加一些逻辑来搜索这里显示的三个模式,它应该适合你的情况。