存档2017年11月14日

Pandas里的日期转字符串

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处理),而放弃了可替代的丑陋的办法。