繁体   English   中英

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

[英]Pandas: Change dates in dataframe to same date format

我有一个数据框,其中包含一个包含以下内容的列:

Date:
31MAR2005
30-06-05
311205

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

您可以使用Pandas的矢量化字符串方法从每个日期字符串中提取日,月和年:

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函数更快。

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

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

df['Date'] = pd.to_datetime(df['Date'])

将日期字符串转换为适当的Timestamps 然后无效的日期字符串将成为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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM