[英]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.