我正在使用包含'%B-%Y'格式的日期的数据框,需要将它们转换回日期时间'%Y-%m-%d'格式才能进行日期计算。
例如,我想将old_date = 'July - 2016'
转换为新的日期变量new_date = '2016-07-15'
,可以在一天中使用任意值(这里是每月的15号)。
我第一次解决问题,返回了TypeError: unsupported operand type(s) for -: 'str' and 'str'
:
from datetime import datetime
df['new_date'] = datetime.strptime(str(df['old_date']), '%Y-%m-15')
答案 0 :(得分:1)
编辑::
我没有进行任何基准测试,但是您知道,将列转换为日期,然后执行... df['your_column'] = pd.to_datetime(df['your_column'])
会将任何日期转换为ISO格式。参见下面的第二个示例。
第二个示例应该更快一些。 :)
import pandas as pd
from datetime import datetime
data = {
'A' : ['July - 2019', 'June - 2020'],
'B' : [1, 2]
}
df = pd.DataFrame(data)
print(df, end='\n\n')
# A B
# 0 July - 2019 1
# 1 June - 2020 2
day_to_put = 15
df['A'] = df['A'].apply( lambda x: datetime.strptime(x, '%B - %Y')\
.replace(day=day_to_put)\
.strftime('%Y-%m-%d') )
print(df)
# A B
#0 2019-07-15 1
#1 2020-06-15 2
import pandas as pd
from datetime import datetime
data = {
'A' : ['July - 2019', 'June - 2020'],
'B' : [1, 2]
}
df = pd.DataFrame(data)
print(df, end='\n\n')
# A B
# 0 July - 2019 1
# 1 June - 2020 2
df['A'] = pd.to_datetime(df['A'])
print(df)
# A B
# 0 2019-07-01 1
# 1 2020-06-01 2
答案 1 :(得分:1)
不是很整洁,但是应该可以工作:
months = {'January': '1',
'Febuary': '2',
'March': '3',
'April': '4',
'May': '5',
'June': '6',
'July': '7',
'August': '8',
'September': '9',
'October': '10',
'November': '11',
'December': '12'}
def convert(old_date):
pts = old_date.split(' - ')
return '-'.join((pts[1], months[pts[0]], '15'))
说明:
months = {'January': '1', ...
创建月份名称→数字字典pts = old_date.split(' - ')
将输入拆分为['July', '2016']
形式(pts[1], months[pts[0]], '15')
一个元组,包含:
pts[1]
第二个值(年)months[pts[0]]
在上述字典中查找第一个值(月份名称)15
,根据情况更改'-'.join(...)
将上述元组的值与它们之间的-
连接起来 * 1 * 1 请参见String.join
方法的this文档。
答案 2 :(得分:1)
您可以使用以下语法:
df['new_date'] = pd.to_datetime(df['old_date'],format='%b-%Y').dt.strftime('%Y-%m-%d')