Python 从包含时间序列的数组里,取不完整月份的最后一天的日期

场景:

Python中,DataFrame包含时间序列,需要从时间序列中取出每个月最后一天的日期。

模拟数据介绍:

DataFrame大小是(600,2),2列数据date和value,date是连续的从2018-01-01到2019-08-23,value连续的从0到599,想要的结果是每个月最后一天的日期,比如:2018-01-31、2018-02-28...2019-08-23,并把结果存到列表中。

#模拟数据代码
import pandas as pd
import numpy as np
data = pd.DataFrame(np.arange(600), columns=['value'])
data['date'] = pd.date_range('1/1/2018', periods=600)
data = data[['date', 'value']]
print(data.head(), '\n', data[-3:])
print(data.shape)
#模拟数据展示
 date  value
0 2018-01-01      0
1 2018-01-02      1
2 2018-01-03      2
3 2018-01-04      3
4 2018-01-05      4 
           date  value
597 2019-08-21    597
598 2019-08-22    598
599 2019-08-23    599
(600, 2)

获取过程:

根据date创建了2个辅助列:year和month,根据辅助列year和month进行分组(groupby),这会把每年每个月的数据放到一起,然后取每个分组中最大(max)的日期,并存放到列表(to_list)中,从而实现需求。之后再删除(drop)辅助列,恢复数组原来的样子。

# 获取月份最后一天的日期的代码
data['year'] = data['date'].apply(lambda x: x.year)
data['month'] = data['date'].apply(lambda x: x.month)
grouped = data['date'].groupby([data['year'], data['month']])
last_day = grouped.max().to_list()
data.drop(['year', 'month'], axis=1, inplace=True)
print(last_day)
#每月最后一天的日期的展示
[Timestamp('2018-01-31 00:00:00'), Timestamp('2018-02-28 00:00:00'), Timestamp('2018-03-31 00:00:00'), Timestamp('2018-04-30 00:00:00'), 
Timestamp('2018-05-31 00:00:00'), Timestamp('2018-06-30 00:00:00'), Timestamp('2018-07-31 00:00:00'), Timestamp('2018-08-31 00:00:00'), 
Timestamp('2018-09-30 00:00:00'), Timestamp('2018-10-31 00:00:00'), Timestamp('2018-11-30 00:00:00'), Timestamp('2018-12-31 00:00:00'),
 Timestamp('2019-01-31 00:00:00'), Timestamp('2019-02-28 00:00:00'), Timestamp('2019-03-31 00:00:00'), Timestamp('2019-04-30 00:00:00'),
 Timestamp('2019-05-31 00:00:00'), Timestamp('2019-06-30 00:00:00'), Timestamp('2019-07-31 00:00:00'), Timestamp('2019-08-23 00:00:00')]

这里的需求是取每月最后一天的日期,可以延申下,取每月最后一天对应的value,只要把目标列换下就可以:

grouped = data['value'].groupby([data['year'], data['month']])
发布了34 篇原创文章 · 获赞 4 · 访问量 3375

猜你喜欢

转载自blog.csdn.net/lvhuike/article/details/99658860