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

时间:2018-08-22 23:45:01

标签: python

我正在尝试将月份名称更改为python中的日期,但出现错误:

ValueError: time data 'October' does not match format '%m/%d/%Y'

我的CSV包含十月这样的值,我想将其更改为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)

任何帮助将不胜感激

5 个答案:

答案 0 :(得分:3)

难道您不可以只编写一个映射到每个函数的映射吗?实际上,可以使用字典。

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)

答案 1 :(得分:3)

@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}

答案 2 :(得分:2)

%m/%d/%y之类的格式字符串传递给strftime的全部目的是,您要指定输入字符串将采用的格式。

您可以看到the documentation,但很明显%m/%d/%y这样的格式不会处理'October'这样的字符串。您要输入(零填充)月份号,斜杠,(零填充)日期号,斜杠和(零填充)(两位数)年。

如果您指定的格式实际上与输入内容相符,那么一切都会正常进行:

>>> datetime.datetime.strptime('October', '%B')
datetime.datetime(1900, 10, 1, 0, 0)

但是,这仍然不是您想要的,因为默认年份是1900,而不是2018。因此,您需要replace,或者拉出月份并构建新的datetime对象。 / p>

>>> datetime.datetime.strptime('October', '%B').replace(year=2018)
datetime.datetime(2018, 10, 1, 0, 0)

还要注意,strptime知道的所有字符串都是特定于语言环境的。如果您设置了英语为英语的语言环境,例如en_US.UTF-8C,则%B表示英语月份,因此一切都很好。但是,如果您设置了br_PT.UTF-8,则要求它与巴西葡萄牙语月份的名称相匹配,例如Outubro而不是October 1


1。由于我实际上并不了解巴西葡萄牙语,因此我可以选择一个非常愚蠢的例子……但是Google说它是Outubro,而当Google Translate这样做时会导致错误吗?

答案 3 :(得分:0)

我假设数据主要采用您指定的格式(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)

然后

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

答案 4 :(得分:0)

@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}