如何将Python日期格式'%B-%Y'转换回'%Y-%m-%d'?

时间:2019-03-21 14:25:23

标签: python datetime

我正在使用包含'%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')

3 个答案:

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