Python 如何操作datetime对象以获取上个月的最后日期
我有一个熊猫数据框,希望将所有日期转换为上个月的最后一个日期。例如,“2020-02-04”应该变成“2020-01-31”,“2020-03-03”应该变成“2020-02-28”等等。我的df如下所示(在“月份”列中,我已经有了我想要的日期的正确月份): 现在我试着这样做:Python 如何操作datetime对象以获取上个月的最后日期,python,pandas,datetime,Python,Pandas,Datetime,我有一个熊猫数据框,希望将所有日期转换为上个月的最后一个日期。例如,“2020-02-04”应该变成“2020-01-31”,“2020-03-03”应该变成“2020-02-28”等等。我的df如下所示(在“月份”列中,我已经有了我想要的日期的正确月份): 现在我试着这样做: import calendar import datetime today = datetime.now() dfall.date = str(today.year) + "-" + str(dfal
import calendar
import datetime
today = datetime.now()
dfall.date = str(today.year) + "-" + str(dfall.month) + "-" + str(calendar.monthrange(today.year,dfall.month)[1])
这个想法是通过将字符串添加到一起来构建新的日期。但此代码会引发一个错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我知道错误来自这一部分:
str(calendar.monthrange(today.year,dfall.month)[1])
(没有这一部分,代码运行时不会出错,但结果不是我想要的)。这可能是因为python不知道从dfall.month
中取哪个月。有人知道我如何处理这个问题吗?作为替代方案,您可以尝试以下方法:
dfall.date=dfall.date.apply(lambda x: x.replace(day=1)- pd.Timedelta(days=1))
dfall.date=pd.to_datetime(dfall.date).apply(lambda x: x.replace(day=1)- pd.Timedelta(days=1))
如果dfall.date
是字符串类型,请尝试以下操作:
dfall.date=dfall.date.apply(lambda x: x.replace(day=1)- pd.Timedelta(days=1))
dfall.date=pd.to_datetime(dfall.date).apply(lambda x: x.replace(day=1)- pd.Timedelta(days=1))
您可以尝试另一个矢量化的替代方案,由,以避免使用
df.apply(lambda x:x.replace(day=1))
和:
如果要保留原始解决方案,请执行以下操作:
- 将
更改为str(dfall.month)
dfall.month.astype(str)
- 将
更改为str(calendar.monthrange(today.year,dfall.month)[1])
dfall.month.apply(lambda x:calendar.monthrange(today.year,x)[1])。astype(str
- 一旦你有了这个字符串,你应该将它转换为datetime:
pd.to\u datetime(dfall.date)
所有解决方案的输出:
dfall[["date", "month"]]
date month
0 2020-01-31 1
1 2020-02-29 2
2 2020-03-31 3
3 2020-04-30 4
4 2020-05-31 5
5 2020-06-30 6
作为替代方案,您可以尝试以下方法:
dfall.date=dfall.date.apply(lambda x: x.replace(day=1)- pd.Timedelta(days=1))
dfall.date=pd.to_datetime(dfall.date).apply(lambda x: x.replace(day=1)- pd.Timedelta(days=1))
如果dfall.date
是字符串类型,请尝试以下操作:
dfall.date=dfall.date.apply(lambda x: x.replace(day=1)- pd.Timedelta(days=1))
dfall.date=pd.to_datetime(dfall.date).apply(lambda x: x.replace(day=1)- pd.Timedelta(days=1))
您可以尝试另一个矢量化的替代方案,由,以避免使用
df.apply(lambda x:x.replace(day=1))
和:
如果要保留原始解决方案,请执行以下操作:
- 将
更改为str(dfall.month)
dfall.month.astype(str)
- 将
更改为str(calendar.monthrange(today.year,dfall.month)[1])
dfall.month.apply(lambda x:calendar.monthrange(today.year,x)[1])。astype(str
- 一旦你有了这个字符串,你应该将它转换为datetime:
pd.to\u datetime(dfall.date)
所有解决方案的输出:
dfall[["date", "month"]]
date month
0 2020-01-31 1
1 2020-02-29 2
2 2020-03-31 3
3 2020-04-30 4
4 2020-05-31 5
5 2020-06-30 6
备选办法:
import datetime
for index, d in df.iterrows():
temp = d["date"]
dtObj = datetime.datetime.strptime(temp, "%Y-%m-%d")
newDt = dtObj - datetime.timedelta(days=dtObj.day)
df["date"][index] = datetime.datetime.strftime(newDt, "%Y-%m-%d")
从datetime导入datetime,TimeDelta
def转换日期(日期):
date=datetime.strTime(日期“%Y-%m-%d”)
return(date-timedelta(days=date.day)).strftime(“%Y-%m-%d”)
dfall.date.apply(转换日期)
替代方法:
import datetime
for index, d in df.iterrows():
temp = d["date"]
dtObj = datetime.datetime.strptime(temp, "%Y-%m-%d")
newDt = dtObj - datetime.timedelta(days=dtObj.day)
df["date"][index] = datetime.datetime.strftime(newDt, "%Y-%m-%d")
从datetime导入datetime,TimeDelta
def转换日期(日期):
date=datetime.strTime(日期“%Y-%m-%d”)
return(date-timedelta(days=date.day)).strftime(“%Y-%m-%d”)
dfall.date.apply(转换日期)
假设'date'
列是字符串类型(使用.astype(str)
或strftime
否则),您可以将年-月部分转换为datetime
并减去一天的timedelta
:
dfall['lastdaylastmonth'] = pd.to_datetime(dfall['date'].str[:-3]) - pd.Timedelta(days=1)
# dfall['lastdaylastmonth']
# 0 2020-01-31
# 1 2020-02-29
# 2 2020-03-31
# 3 2020-04-30
# 4 2020-05-31
# 5 2020-06-30
# Name: lastdaylastmonth, dtype: datetime64[ns]
假设
'date'
列的类型为string(使用.astype(str)
或strftime
否则),您可以将年-月部分转换为datetime
并减去一天的timedelta
:
dfall['lastdaylastmonth'] = pd.to_datetime(dfall['date'].str[:-3]) - pd.Timedelta(days=1)
# dfall['lastdaylastmonth']
# 0 2020-01-31
# 1 2020-02-29
# 2 2020-03-31
# 3 2020-04-30
# 4 2020-05-31
# 5 2020-06-30
# Name: lastdaylastmonth, dtype: datetime64[ns]
另一种方法:
import datetime
for index, d in df.iterrows():
temp = d["date"]
dtObj = datetime.datetime.strptime(temp, "%Y-%m-%d")
newDt = dtObj - datetime.timedelta(days=dtObj.day)
df["date"][index] = datetime.datetime.strftime(newDt, "%Y-%m-%d")
另一种方法:
import datetime
for index, d in df.iterrows():
temp = d["date"]
dtObj = datetime.datetime.strptime(temp, "%Y-%m-%d")
newDt = dtObj - datetime.timedelta(days=dtObj.day)
df["date"][index] = datetime.datetime.strftime(newDt, "%Y-%m-%d")
从日期时间导入日期时间 日期表 日期=[日期时间(2020,2,4),日期时间(2020,3,3), datetime(2020,4,2),datetime(2020,5,5), 日期时间(2020,6,3),日期时间(2020,7,2)] “月份”列的值 月份=[1,2,3,4,5,6] 创建以日期为索引的系列 ts=pd.系列(月,指数=日期) 班次可追溯到一个月前,并储存在date_col 日期列=ts.shift(-1,freq='M')。索引 将修改后的日期用作DataFrame中的列
pd.DataFrame({'Dates':date\u col,'Month':Month})from datetime import datetime 日期表 日期=[日期时间(2020,2,4),日期时间(2020,3,3), datetime(2020,4,2),datetime(2020,5,5), 日期时间(2020,6,3),日期时间(2020,7,2)] “月份”列的值 月份=[1,2,3,4,5,6] 创建以日期为索引的系列 ts=pd.系列(月,指数=日期) 班次可追溯到一个月前,并储存在date_col 日期列=ts.shift(-1,freq='M')。索引 将修改后的日期用作DataFrame中的列
pd.DataFrame({'Dates':date_col,'Month':Month})谢谢您,这是有效的,但不幸的是,格式看起来像“2020-1-31”,pandas无法将其转换为datetime对象。这需要是“2020-01-31”。不管怎样,我从下面的答案中找到了一个解决方案。谢谢你,这是可行的,但不幸的是,格式看起来像“2020-1-31”,熊猫无法将其转换为datetime对象。这需要是“2020-01-31”。不管怎样,我从下面的答案中找到了一个解决方案。如果你考虑接受或支持一个答案来奖励那些帮助过你的人,那就好了,或者如果你有错误的地方,你也可以留下评论。是的,你是对的,我对每个答案都投了赞成票,但还没有接受。我知道:)别担心!很高兴你找到了答案:“如果你考虑接受或支持一个答案来奖励那些帮助过你的人,或者如果你有错误的地方,你也可以留下评论的话,那么TyHyooIT会很好。”是的,你是对的,我对每个答案都投了赞成票,但还没有接受。我知道:)别担心!很高兴你找到了答案:)@thyhmoo