在python中将月份名称更改为日期

在python中将月份名称更改为日期,python,Python,我试图在python中将月份名称更改为date,但出现了一个错误: ValueError: time data 'October' does not match format '%m/%d/%Y' 我的CSV中有10月这样的值,我想将其更改为10/01/2018 import pandas as pd import datetime f = pd.read_excel('test.xlsx', 'Sheet1', index_col=None) keep_col = ['Month'] ne

我试图在python中将月份名称更改为date,但出现了一个错误:

ValueError: time data 'October' does not match format '%m/%d/%Y'
我的CSV中有10月这样的值,我想将其更改为10/01/2018

import pandas as pd
import datetime

f = pd.read_excel('test.xlsx', 'Sheet1', index_col=None)
keep_col = ['Month']
new_f = f[keep_col]
f['Month'] = f['Month'].apply(lambda v: datetime.datetime.strptime(v, '%m/%d/%Y'))
    new_f.to_csv("output.csv", index=False)

如果您能提供任何帮助,我们将不胜感激。

难道您不能为每个函数编写一个函数映射吗?事实上,一本字典就可以了

def convert_monthname(monthname):
    table = {"January": datetime.datetime(month=1, day=1, year=2018),
             "February": datetime.datetime(month=2, day=1, year=2018),
             ...}

    return table.get(monthname, monthname)

f['Month'] = f['Month'].apply(convert_monthname)

作为@AdamSmith答案的详细说明,定义名称和日期之间映射的更好方法是使用
calendar
模块,该模块已经有一个名称列表:

import calendar
table = {name: datetime.datetime(month=1, day=val, year=2018) 
          for val, name in enumerate(calendar.month_name) if val>0}

将格式字符串(如
%m/%d/%y
传递给
strftime
)的关键在于指定输入字符串的格式

您可以看到,但很明显,像
%m/%d/%y
这样的格式不会处理像
'十月'
这样的字符串。你要的是一个(零填充的)月数,一条斜线,一个(零填充的)日数,一条斜线和一个(零填充的)(两位数)年

如果您指定的格式确实与您的输入匹配,则一切正常:

>>> datetime.datetime.strptime('October', '%B')
datetime.datetime(1900, 10, 1, 0, 0)
然而,这仍然不是你想要的,因为默认年份是1900年,而不是2018年。因此,您要么需要这样做,要么将月份取出并构建一个新的datetime对象

>>> datetime.datetime.strptime('October', '%B').replace(year=2018)
datetime.datetime(2018, 10, 1, 0, 0)
另外,请注意,
strtime
知道的所有字符串都是特定于语言环境的。如果您设置了英语区域设置,如
en_US.UTF-8
C
,那么
%B
表示英语月份,因此一切都很好。但是如果你设置了,比如说,
br_PT.UTF-8
,那么你要求它匹配巴西葡萄牙语月份名称,比如
Outubro
,而不是
十月
。1



一,。因为我实际上不懂巴西葡萄牙语,所以这对我来说是一个非常愚蠢的例子……但谷歌说这是Outubro,谷歌翻译什么时候会导致错误的结果?

我假设数据大部分是您指定的格式(
mm/dd/yyyy
),但一些异常行中有月份名称

在不添加任何额外依赖项的情况下:

DATE_FORMAT = '%m/%d/Y'
MONTH_NAME_MAP = {
    "january": 1,
    "jan": 1,
    "february": 2,
    "feb": 2,
    # ...
}

def parse_month_value(value):
    # check if the value is a name of a month
    month_int = MONTH_NAME_MAP.get(value.lower())
    if month_int:
        this_year = datetime.date.today().year
        return datetime.datetime(month=month_int, day=1, year=this_year)

    # try to parse it normally, failing and raising exception if needed.
    return datetime.datetime.strptime(value, DATE_FORMAT)

然后


来自@DYZ的答案实际上是为我做的,我添加了strftime来创建dict作为我想要的日期字符串

months = {str(name).lower(): datetime.datetime(month=val, day=1, year=2016).strftime('%d/%m/%Y')
      for val, name in enumerate(calendar.month_abbr) if val>0}

简单的投票,伟大的答案!关于使用日历模块可以做的其他事情,有一个很好的教程。
months = {str(name).lower(): datetime.datetime(month=val, day=1, year=2016).strftime('%d/%m/%Y')
      for val, name in enumerate(calendar.month_abbr) if val>0}