在python中从month -year生成每月的最后一天

时间:2019-07-19 11:55:55

标签: python pandas date datetime

使用month_year将对象转换为该月的最后日期

如何生成一个新列,其月份的最后日期为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

3 个答案:

答案 0 :(得分:0)

使用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

答案 1 :(得分:0)

请在日期的第一天添加日期部分。像Jan-2019将是01-Jan-2019,然后使用datetime.timedelta,添加一个月并减去1天。

答案 2 :(得分:0)

使用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