Pandas对时间序列的处理可以说是功能繁多,但感觉找遍了度娘,也没有发现一个能把日期处理成“2017-11”这样到月份格式的方法。后来发现了一个strftime方法,很简单:
df['time'].strftime('%Y-%m')
#以下是格式定义
代码 说明
%Y 4位数的年
%y 2位数的年
%m 2位数的月[01,12]
%d 2位数的日[01,31]
%H 时(24小时制)[00,23]
%l 时(12小时制)[01,12]
%M 2位数的分[00,59]
%S 秒[00,61]有闰秒的存在
%w 用整数表示的星期几[0(星期天),6]
%F %Y-%m-%d简写形式例如,2017-06-27
%D %m/%d/%y简写形式
举个例子:
strtime=['2000-01-31', '2000-02-29', '2000-03-31', '2000-04-30',
'2000-05-31', '2000-06-30', '2000-07-31', '2000-08-31',
'2000-09-30', '2000-10-31']
index=pd.to_datetime(strtime)
time=pd.to_datetime(strtime)
data=list(range(1,11))
df=pd.DataFrame([time,data],columns=index,index=['time','data']).T
#索引和time字段均为Timestamp格式数据
type(index[0])
Out[59]: pandas.tslib.Timestamp
type(df.index[0])
Out[60]: pandas.tslib.Timestamp
type(df.time[0])
Out[61]: pandas.tslib.Timestamp
#先来看索引
mt_time=df.index.strftime('%Y-%m')
mt_time
Out[64]:
array(['2000-01', '2000-02', '2000-03', '2000-04', '2000-05', '2000-06',
'2000-07', '2000-08', '2000-09', '2000-10'],
dtype='<U7')
type(mt_time[0])
Out[65]: numpy.str_
#针对列(直接操作还不清楚怎么操作)
time_list=[x.strftime('%Y-%m') for x in df['time']]
time_list
Out[76]:
['2000-01',
'2000-02',
'2000-03',
'2000-04',
'2000-05',
'2000-06',
'2000-07',
'2000-08',
'2000-09',
'2000-10']
#再按月份求和
df['data'].groupby(time_list).sum()
Out[77]:
2000-01 1
2000-02 2
2000-03 3
2000-04 4
2000-05 5
2000-06 6
2000-07 7
2000-08 8
2000-09 9
2000-10 10
Name: data, dtype: int64
有的时候,真的是为了所谓的聪明(找到最优雅的方法计算结果)的办法绞尽脑汁(比如在groupby的时候怎么直接用strftime处理),而放弃了可替代的丑陋的办法。