在python中将月份名称更改为日期
我试图在python中将月份名称更改为date,但出现了一个错误:在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
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}