Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何操作datetime对象以获取上个月的最后日期_Python_Pandas_Datetime - Fatal编程技术网

Python 如何操作datetime对象以获取上个月的最后日期

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

我有一个熊猫数据框,希望将所有日期转换为上个月的最后一个日期。例如,“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(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