Python ValueError:时间数据';2018年5月23日&x27日;与格式不匹配';%Y%b%d';(比赛)

Python ValueError:时间数据';2018年5月23日&x27日;与格式不匹配';%Y%b%d';(比赛),python,pandas,datetime,Python,Pandas,Datetime,我知道这个问题已经被问过很多次了,有很多答案。我遵循了前面的线程,但仍然遇到错误。我正在尝试将日期列表转换为将日期定义为一年中第n个日期的格式 我在熊猫数据框中有一个时间列表,我定义为: time = data.loc[:, 'date'] 例如,它以“2018年9月12日”的形式打印日期。我试着把这些日期转换成一年中的第n天,从今天开始回到过去。所以我希望这些日期是“5天前”、“10天前”等等 当我尝试使用pandas datetime模块时,我得到了一个甚至无法识别格式的值错误,我不知道为

我知道这个问题已经被问过很多次了,有很多答案。我遵循了前面的线程,但仍然遇到错误。我正在尝试将日期列表转换为将日期定义为一年中第n个日期的格式

我在熊猫数据框中有一个时间列表,我定义为:

time = data.loc[:, 'date']
例如,它以“2018年9月12日”的形式打印日期。我试着把这些日期转换成一年中的第n天,从今天开始回到过去。所以我希望这些日期是“5天前”、“10天前”等等

当我尝试使用pandas datetime模块时,我得到了一个甚至无法识别格式的值错误,我不知道为什么。我有:

date = pd.to_datetime(time, format='%Y%b%d')
但我得到了一个错误:

ValueError:时间数据“2018年5月23日”与格式“%Y%b%d”不匹配(匹配)

我计划按照这一思路采取以下行动:

new_year_day = pd.Timestamp(year=date.year, month=1, day=1)
day_of_the_year = (date - new_year_day).days + 1
虽然我不确定那会得到我想要的

有人知道1)为什么会出现ValueError,2)如何修复,以及3)如何将日期格式化为“x天前”吗


感谢您的输入。

如果您将整列“日期”转换为日期时间戳,您可以得到另一列,即今天与以天为单位的日期之差

import datetime
today = datetime.datetime.now()
df['date']= pd.to_datetime(df['date'],format='%Y %b %d')
def delta(x):
   dif = today-x
   res=dif.days
   return res
df['days_diff'] = df['date'].apply(delta)
如果需要,可以将
df['days\u diff']
作为一个列表,并逐个添加“days ago”文本进行打印

或者,您可以使用下面的行将文本“days ago”添加到
df['days_diff']
列中,如果过去的天数和未来日期中的“days to go”在列本身中。但是,这将
df['days\u diff']
的类型从'int'转换为'object'

df['days_diff'] = np.where(df['days_diff']>=0, df['days_diff'].astype(str)+ 'days ago',df['days_diff'].astype(str)+ 'days to go')

如果将整列“日期”转换为日期时间戳,则可以得到另一列,即今天与以天为单位的日期之间的差值

import datetime
today = datetime.datetime.now()
df['date']= pd.to_datetime(df['date'],format='%Y %b %d')
def delta(x):
   dif = today-x
   res=dif.days
   return res
df['days_diff'] = df['date'].apply(delta)
如果需要,可以将
df['days\u diff']
作为一个列表,并逐个添加“days ago”文本进行打印

或者,您可以使用下面的行将文本“days ago”添加到
df['days_diff']
列中,如果过去的天数和未来日期中的“days to go”在列本身中。但是,这将
df['days\u diff']
的类型从'int'转换为'object'

df['days_diff'] = np.where(df['days_diff']>=0, df['days_diff'].astype(str)+ 'days ago',df['days_diff'].astype(str)+ 'days to go')

您可以将日期转换为我在注释中提到的日期时间,并使用apply查找timedelta

df = pd.DataFrame({'date':['2018 May 23']})
df['date'] = pd.to_datetime(date, format='%Y %b %d')
df['delta'] = df['date'].apply(lambda x: x - pd.to_datetime(x.year, format = '%Y') )
你得到

    date        delta
0   2018-05-23  142 days
注意:timedelta是一种日期格式,表示持续时间,即两个日期或时间之间的差值。如果您想在几天前连接,首先需要将时间增量转换为字符串类型

df['delta'] = df['delta'].dt.days.astype(str) + ' days ago'
然后你得到

    date        delta
0   2018-05-23  142 days ago

您可以将日期转换为我在注释中提到的日期时间,并使用apply查找timedelta

df = pd.DataFrame({'date':['2018 May 23']})
df['date'] = pd.to_datetime(date, format='%Y %b %d')
df['delta'] = df['date'].apply(lambda x: x - pd.to_datetime(x.year, format = '%Y') )
你得到

    date        delta
0   2018-05-23  142 days
注意:timedelta是一种日期格式,表示持续时间,即两个日期或时间之间的差值。如果您想在几天前连接,首先需要将时间增量转换为字符串类型

df['delta'] = df['delta'].dt.days.astype(str) + ' days ago'
然后你得到

    date        delta
0   2018-05-23  142 days ago

您错过了格式中的空格,请尝试pd。to_datetime(time,format='%Y%b%d')是的,找到了!就在你评论之前。非常感谢。您对第二位--“5天前”的转换有什么想法吗?您错过了格式中的空格,请尝试pd.to_datetime(time,format='%Y%b%d')是的,明白了!就在你评论之前。非常感谢。你对第二位--“5天前”的转换有什么想法吗?