【问题标题】:generate last day of the month from month -year in python在python中从月-年生成月的最后一天
【发布时间】:2019-07-19 11:55:55
【问题描述】:

将对象转换为月份的最后一个日期

如何从 month_year 生成一个包含该月最后一个日期的新列? Month_year 是一个对象,我无法在 python 中将其转换为日期格式。我希望最后一个日期采用日期格式,以便我可以计算与数据中其他可用日期列的差异。

数据如下:

id   month_date
id_1 04-2018
id_1 04-2018
id_2 04-2018
id_2 05-2019

期望的输出:

id   month_date  last_date
id_1 04-2018    30-4-2018
id_1 04-2018    30-4-2018
id_2 04-2018    30-4-2018
id_2 05-2019    31-5-2019

【问题讨论】:

  • 正在使用pandas
  • 是的,它是一个熊猫数据框,我想在其上进行这些更改。如果我检查 month_year 列的 dtype 我得到对象并且无法为此执行任何日期相关计算

标签: python pandas date datetime


【解决方案1】:

Series.to_timestampSeries.dt.floor 一起用于删除时间:

df['last_date'] = df['month_date'].dt.to_timestamp(how='end').dt.floor('d')
print (df)
     id month_date  last_date
0  id_1    2018-04 2018-04-30
1  id_1    2018-04 2018-04-30
2  id_2    2018-04 2018-04-30
3  id_2    2019-05 2019-05-31

另一种解决方案:

df['last_date'] = df['month_date'].dt.to_timestamp() + pd.offsets.MonthEnd()
print (df)
     id month_date  last_date
0  id_1    2018-04 2018-04-30
1  id_1    2018-04 2018-04-30
2  id_2    2018-04 2018-04-30
3  id_2    2019-05 2019-05-31

编辑:

另一种解决方案:

df['last_date1'] = pd.PeriodIndex(df['month_date']).to_timestamp(how='end').floor('d')
df['last_date2'] = pd.PeriodIndex(df['month_date']).to_timestamp() + pd.offsets.MonthEnd()
print (df)
     id month_date last_date1 last_date2
0  id_1    2018-04 2018-04-30 2018-04-30
1  id_1    2018-04 2018-04-30 2018-04-30
2  id_2    2018-04 2018-04-30 2018-04-30
3  id_2    2019-05 2019-05-31 2019-05-31

【讨论】:

  • 当我尝试任一代码时出现以下错误 -"'pandas._libs.tslibs.period.Period'> 不能转换为日期时间"
  • @LalithaSundarIyerS - 然后解决方案更简单,给他们一些时间。
  • month_date 列是时间数据 Period('2018-04', 'M') 与格式 '%m-%Y' (匹配)不匹配,所以我更改它以反映 %Y- %m
  • @LalithaSundarIyerS - 答案已编辑,请检查。
  • 只能将 .dt 访问器与 datetimelike 值一起使用 - 新错误
【解决方案2】:

请将日期部分添加为当月 1 日。就像 Jan-2019 将是 01-Jan-2019,然后使用 datetime.timedelta ,增加一个月并减少 1 天。

【讨论】:

    【解决方案3】:

    使用MonthEnd

    例如:

    from pandas.tseries.offsets import MonthEnd
    df = pd.DataFrame({"month_date": ["04-2018", "04-2018", "04-2018", "05-2019"]})
    df["month_date"] = pd.to_datetime(df["month_date"], format="%m-%Y")
    df["last_date"] = (df["month_date"] + MonthEnd(1)).dt.strftime("%d-%m-%Y")
    df["month_date"] = df["month_date"].dt.strftime("%m-%Y")
    print(df)
    

    输出:

      month_date   last_date
    0    04-2018  30-04-2018
    1    04-2018  30-04-2018
    2    04-2018  30-04-2018
    3    05-2019  31-05-2019
    

    【讨论】:

    • 'pandas._libs.tslibs.period.Period'> 不能转换为日期时间.. 我收到此错误
    猜你喜欢
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2015-07-09
    • 2021-12-04
    相关资源
    最近更新 更多