我有一个包含一列的数据框:
Date:
31MAR2005
30-06-05
311205
我想将这些日期转换为以下格式:30-06-05(DD-MM-JJ)。最简单的方法是什么?这些字段还没有日期格式,只有字符串。
答案 0 :(得分:2)
您可以使用Pandas' vectorize string methods从每个日期字符串中提取日,月和年:
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
现在,您可以通过调用Series.map
:
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 [230]: tmp
Out[230]:
day month year
0 31 03 05
1 30 06 05
2 31 12 05
最后,您可以将df['Date']
重新指定为所需的日期字符串格式:
df['Date'] = tmp['day']+'-'+tmp['month']+'-'+tmp['year']
产量
In [232]: df
Out[232]:
Date
0 31-03-05
1 30-06-05
2 31-12-05
特别是如果DataFrame很长,
使用向量化字符串方法应该比使用df.apply
为每个行值调用一次Python函数更快。
另请注意,这可以在不解析字符串的情况下完成任务
时间戳。这可能是好事也可能是坏事。
一方面,它可以提高性能。上
另一方面,它可能允许无效的日期字符串(例如'30FEB2005'
)漏掉。
重新格式化字符串后,您可以调用
df['Date'] = pd.to_datetime(df['Date'])
将日期字符串转换为正确的Timestamps
。然后,无效的日期字符串将变为NaT
(非时间戳)值。
答案 1 :(得分:2)
以下是我的例子:
private static int getYear(char[] charArray)
{
return Integer.parseInt(String.valueOf(charArray));
}
现在我在您的数据框df上测试它:
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')