字符串不包含日期

时间:2019-03-25 20:09:17

标签: string pandas date dataframe

我有一个带有此列的数据框:

Mi_Meteo['Time_Instant'].head():

0    2013/11/14 17:00
1    2013/11/14 18:00
2    2013/11/14 19:00
3    2013/11/14 20:00
4    2013/11/14 21:00
Name: Time_Instant, dtype: object

做完检查后,我才意识到:

Mi_Meteo['Time_Instant'].value_counts():

2013/12/09 02:00    33
2013/12/01 22:00    33
2013/12/11 10:00    33
2013/12/05 09:00    33
.
.
.
.
2013/11/16 02:00    21
2013/11/07 10:00    11
2013/11/17 22:00    11
DateTIme            3

所以我将其剥离:

Mi_Meteo['Time_Instant'] = Mi_Meteo['Time_Instant'].str.rstrip('DateTIme')# Cause Otherwise I would get this Error When Converting : 'Unknown string format'

然后我尝试将其转换:

Mi_Meteo['Time_Instant'] = pd.to_datetime(Mi_Meteo['Time_Instant'])

但是我得到这个错误:

String does not contain a date.

任何建议都会受到赞赏,谢谢大家。

4 个答案:

答案 0 :(得分:1)

有点晚了,为什么不使用这个:

Mi_Meteo['Time_Instant'] = pd.to_datetime(Mi_Meteo['Time_Instant'], errors='coerce')

pandas.to_datetime文档中,“错误”参数的描述:

错误{'忽略','提高','胁迫'},默认'提高'如果是'提高',则 无效的解析将引发异常。

如果为“强制”,则将无效解析设置为NaT。

如果为“忽略”,则无效的解析将返回输入。

答案 1 :(得分:0)

我在重现您的错误时遇到问题,因此无法确定这是否可以解决您遇到的问题。如果没有,请尝试提供最少的代码/数据样本,以重现您的错误。

这是我试图重现您的情况的

lzt = ['2013/11/16 02:00 ',
       '2013/11/07 10:00 ',
       '2013/11/17 22:00 ',
       'DateTIme',
       'DateTIme',
       'DateTIme']
ser = pd.Series(lzt)
ser = ser.str.rstrip('DateTIme')
ser = pd.to_datetime(ser)

但是,正如我所说的,我没有出现任何错误,因此我们的熊猫版本不同,或者您的数据还有其他问题。使用rstrip保留一些空白的字符串数据:

0    2013/11/16 02:00 
1    2013/11/07 10:00 
2    2013/11/17 22:00 
3                     
4                     
5                     

当我在其上运行pd.to_datetime时,它为我提供了NaT(不是时间):

Out[34]: 
0   2013-11-16 02:00:00
1   2013-11-07 10:00:00
2   2013-11-17 22:00:00
3                   NaT
4                   NaT
5                   NaT
dtype: datetime64[ns]

我想说最好是一起删除不需要的行:

ser = ser[ser != 'DateTIme']

Out[39]: 
0   2013-11-16 02:00:00
1   2013-11-07 10:00:00
2   2013-11-17 22:00:00
dtype: datetime64[ns]

查看是否可行,否则请提供足够的信息以重现该错误。

答案 2 :(得分:0)

我遇到了同样的错误-原来我的两个日期是空的:“”。

要查找有问题的日期的行索引,我使用了以下列表理解:

badRows =   [n for n,x in enumerate(df['DATE'].tolist()) if x.strip() in ['']]

这返回了一个列表,其中包含导致问题的“ DATE”列中的行的索引:

[745672, 745673] 

然后可以就地删除这些行:

df.drop(df.index[badRows],inplace=True)

答案 3 :(得分:0)

对此有两种可能的解决方案:

您可以使用coerce的{​​{1}}参数中的errors来使错误消失,如下所示:pd.to_datetime()

或者,如果您想知道哪些日期具有不可解析的值,则可以通过一次如下转换每个值来进行搜索。不管错误值的类型或格式如何,它们都可以工作:

Mi_Meteo['Time_Instant'] = pd.to_datetime(Mi_Meteo['Time_Instant'], errors='coerce')

dates = [] wrong_dates = [] for i in Mi_Meteo['Time_Instant'],unique(): try: date = pd.to_datetime(i) dates.append(i) except: wrong_dates.append(i) 列表中,您将拥有所有错误的值,而在wrong_dates中,您将拥有所有正确的值