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

时间:2015-09-28 16:47:10

标签: python pandas

我有一个包含一列的数据框:

Date:
31MAR2005
30-06-05
311205

我想将这些日期转换为以下格式:30-06-05(DD-MM-JJ)。最简单的方法是什么?这些字段还没有日期格式,只有字符串。

2 个答案:

答案 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

将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 [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')