如何将日期解释为3月12日而不是2月31日,以ddmmyyyy格式。

3

我的日期格式以 11122020 (ddmmyyyy) 的形式出现在 Pandas 列中。

我使用的是:

datapdf["wholetime"]=pd.to_datetime(datapdf["wholetime"],format='%d%m%Y)  

将日期转换为时间并对其进行处理。

最近我的代码在处理日期3122020时失败了,原因是

ValueError: day is out of range for month

Python将日期解释为2020年31月2日而不是2020年3月12日,导致出现错误。 有人有解决方案吗?

2个回答

5

一种方法是使用 str.zfill 来确保日期有8位数字:

s = pd.Series(["11122020", "3122020"])
pd.to_datetime(s.str.zfill(8), format="%d%m%Y")

输出:

0   2020-12-11
1   2020-12-03
dtype: datetime64[ns]

请注意,本答案仅涉及日期中缺少0的情况。它将不能解析更模糊的项目,如332020,其中月份部分也需要前导0。

1
现在这个程序会对 '572020' 出现问题,但是它仍然被点赞。修改很容易。另一方面,这不应该成为问题,否则 1112020 就会产生歧义。 - Quang Hoang
@QuangHoang 确实。我会添加一条注释。 - Chris
"572020" 也是我的关注点.. 幸运的是,他们发送的月份带有零填充。zfill 完美地帮助了我的情况.. 感谢您的帮助。 - anbu subramanian

1
我可以帮您翻译成中文。这段文字是关于编程的,作者使用了"apply"方法创建了一个自定义日期解析器。如果您有其他日期格式需要解析,可以根据您的需求调整该函数。请注意保留HTML标记。
"使用apply方法的初学者方法,我创建了一个自定义日期解析器。如果你需要解析其他日期格式,你可以根据你的需求调整这个函数。"
import pandas as pd
data = {
    #assuming your dates are mix of ddmmyyyy,dmmyyyy,dmyyyy
    'date': ['11122020','3122020','572020','','222019','3112019']
}

df = pd.DataFrame(data)

def parser(elem):
  res = ''
  if len(elem) > 7:
    res = elem
  elif len(elem) > 6:
    d = '0' + elem[0]
    m = elem[1:3]
    y = elem[3:]
    res = d+m+y
  elif len(elem) > 5:
    d = '0' + elem[0]
    m = '0' + elem[1]
    y = elem[2:]
    res = d+m+y
  else:
    res = ''


  return pd.to_datetime(res, format='%d%m%Y',errors='coerce')

df['date'] = df['date'].apply(parser)
df

输出:

    date
0   2020-12-11
1   2020-12-03
2   2020-07-05
3   NaT
4   2019-02-02
5   2019-11-03

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接