【问题标题】:Pandas - "time data does not match format " error when the string does match the format?Pandas - 当字符串与格式匹配时出现“时间数据与格式不匹配”​​错误?
【发布时间】:2019-04-05 16:47:28
【问题描述】:

我收到一个值错误,提示我的数据与格式不匹配。不确定这是一个错误还是我在这里遗漏了一些东西。我指的是this documentation 的字符串格式。奇怪的是,如果我将“数据”数据框写入 csv 并读入,然后调用下面的函数,它将转换日期,所以我不确定为什么不写入 csv 就无法工作。

有什么想法吗?

data['Date'] = pd.to_datetime(data['Date'], format='%d-%b-%Y')  

我遇到了两个错误

 TypeError: Unrecognized value type: <class 'str'>  

 ValueError: time data '27‑Aug‑2018' does not match format '%d-%b-%Y' (match) 

示例日期 -

2‑Jul‑2018     
27‑Aug‑2018    
28‑May‑2018    
19‑Jun‑2017    
5‑Mar‑2018     
15‑Jan‑2018    
11‑Nov‑2013    
23‑Nov‑2015    
23‑Jun‑2014    
18‑Jun‑2018    
30‑Apr‑2018    
14‑May‑2018    
16‑Apr‑2018    
26‑Feb‑2018    
19‑Mar‑2018    
29‑Jun‑2015   

是不是因为它们都不是两位数的日子?个位数天的字符串格式值是什么?看起来这可能是原因,但我不确定为什么它会在“27”上出错。

结束解决方案(它是 unicode 而不是字符串) -

data['Date'] = data['Date'].apply(unidecode.unidecode)  
data['Date'] = data['Date'].apply(lambda x: x.replace("-", "/"))    
data['Date'] = pd.to_datetime(data['Date'], format="%d/%b/%Y")

【问题讨论】:

  • data['Date'] 的 dtype 是什么? -> data['Date'].dtype
  • 也许你的语言环境不是英语?
  • @onno dtype('O')
  • @kull1n 嗯,应该是。不知道为什么不会。
  • @bbennett36 也许你可以先试试data['Date'].astype(str)

标签: python pandas date datetime


【解决方案1】:

您的日期字符串似乎有问题。我用您的示例数据复制了您的问题,如果我删除连字符并手动替换它们(前三个日期),那么代码就可以工作

pd.to_datetime(df1['Date'] ,errors ='coerce')

输出:

0    2018-07-02
1    2018-08-27
2    2018-05-28
3           NaT
4           NaT
5           NaT
6           NaT
7           NaT
8           NaT
9           NaT
10          NaT
11          NaT
12          NaT
13          NaT
14          NaT
15          NaT

底线:你的连字符看起来像普通的,但实际上是别的东西,只需清理你的源数据就可以了

【讨论】:

  • 是的。看起来它是以 unicode 或其他形式出现的。我会发布我的最终解决方案。谢谢!
  • Errors = "coerce" 应该避免,除非它是最后的解决方案。对于上述问题,以下建议也可以。关键是使用“Str”从“object”转换为“str”模式。 file_name[i] = file_name[i].apply(lambda x : pd.to_datetime(str(x), format='%d/%b/%Y'))
  • @LonelySoul errors='coerce' 并不是一个解决方案。如果您碰巧阅读了答案,但您似乎没有阅读,我将明确说明,如果您手动调整前三个输入但保持其余输入不变,则不会发生错误。
【解决方案2】:

你这里有一个特殊标记它不是-

df.iloc[0,0][2]
Out[287]: '‑'

用'-'替换它

pd.to_datetime(df.iloc[:,0].str.replace('‑','-'),format='%d-%b-%Y')
Out[288]: 
0    2018-08-27
1    2018-05-28
2    2017-06-19
3    2018-03-05
4    2018-01-15
5    2013-11-11
6    2015-11-23
7    2014-06-23
8    2018-06-18
9    2018-04-30
10   2018-05-14
11   2018-04-16
12   2018-02-26
13   2018-03-19
14   2015-06-29
Name: 2‑Jul‑2018, dtype: datetime64[ns]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-05
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2021-03-31
    相关资源
    最近更新 更多