昨天在把别人用R做的数据分析项目用Python复盘,虽然简单,就20来行数据,却花了5,6个小时。简单的在这里写下一点东西
购药时间 社保卡号 商品编码 商品名称 销售数量 应收金额 实收金额 购药时间_new
0 2016-01-01 星期五 1616528 236701 三九感冒灵 7 196 182.00 2016-01-01
1 2016-01-02 星期六 1616528 236701 三九感冒灵 3 84 84.00 2016-01-02
2 2016-01-06 星期三 10070343428 236701 三九感冒灵 3 84 73.92 2016-01-06
3 2016-01-11 星期一 13389528 236701 三九感冒灵 1 28 28.00 2016-01-11
data=pd.read_excel('药品分析.xlsx')
拆分购药时间
data['购药时间_new'] = data['购药时间'].apply(lambda x:x[:-4])
#这个结果下来的数据格式是obj,我刚开始的时候用了datetime.strptime()
#AttributeError: 'Series' object has no attribute 'datetime'
报错这种模式,也是我一直没弄明白字符串用的函数和Series用的函数和DateFrame的区别,弄了一晚上以为是我拆分有问题
def word_cut(word):
position = word.find(' ')
if position !=-1:
y=word[:position]
else:
y=word[:-3]
return y
还是不行,于是
def word_cut(word):
pattern = r'/^(d{4}|d{2})-((0([0-9]{1}))|(1[0-2]{1})-(3(0|1)|(([0-2]{1})([0-9]{1}))$/'
m = re.findall(pattern,word)
return m
还是不行,后来仔细的找了下书。
datetime.strptime是可以的
data['购药时间'].apply(lambda x:datetime.strptime(x,"%Y-%m-%d")) 这样的格式就是datitime64格式了
在转化为第几周就容易了
data['购药时间'].apply(lambda x:datetime.strptime(x,"%Y-%m-%d")).dt.strptime('%Y-%W')
后来发现:
from dateutil.parser import parse
data['购药时间'].apply(lambda x:parse(x)) 就直接是datetime64格式了
或者直接就是
pd.to_datetime(date['购药时间']) to_datetime可以直接作用与Series
一定清晰的区分函数作用于字符串,作用于Series 和DataFrame的区别和各种用法。
中间有个计算月份的,可能我写的也比较复杂:
min = per_month_duplicated['购药时间_month'].min()
max = per_month_duplicated['购药时间_month'].min()
month =len(pd.period_range(min,max,freq='M'))
应该有简单的方法,下次再来更新
然后就是作图
data.groupby['购药时间_new_week'].实收金额.sum().plot()
plt.xlabel('周数')
plt.ylabel('金额')
plt.title('每周购买金额')
plt.show()