pandas处理excel里的时间问题
win10 64位pycharm
一、要做的事:
1.读取excel中的时间数据;
2.把表格中的up_time, down_time转换成小时数。比如 8:30:00转成8.5小时整形数字
3.画叠加柱状图,up_time 在下边down_time上边的堆叠图。
二、问题:
现在在code里写了两个函数,发现excel里的数据是object类型。用这两个函数都不能用apply操作转换。
请帮忙提出实现一功能,需要如何修改或者思路。
import pandas as pd
import matplotlib.pyplot as plt
# #函数一:字符串类型的时间转换
# def to_time(x):
# h,m,s=x.strip().split(':')
# return int(h)+int(m/60)
#函数二:时间类型转换成
def to_time(y):
h = y.hour
m = y.minute
s = y.second
return int(h)+int(m/60)
data = pd.read_excel(r'demo.xlsx')
# print(data)
print(data.dtypes)
#计算开车时间和停车时间
data = data.loc.loc
print('1')
print(data)
print('2')
#绘制叠加柱状图
data.plot.bar(x='date',y=['up_time','down_time'],stacked=True)
#设置标题
plt.title ('up_time vs down_time per shift',fontsize=16,fontweight='bold')
#紧凑型标签
plt.tight_layout()
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv("原始数据")#最好是csv文件
#定义时间转化函数
def to_time(y):
h = pd.to_datetime(y).hour
m = pd.to_datetime(y).minute
s = pd.to_datetime(y).second
return int(h)+round(m/60,2)
data["up_time"] = data["up_time"].apply(to_time)
data["down_time"] = data["down_time"].apply(to_time)
data.plot.bar(x='date',y=['up_time','down_time'],stacked=True)
#我除了原始数据是csv文件之外,所有数据都跟你是一样的
#我这里是有结果的,如果你按照这个代码还改不了,那你就在仔细复习以下apply函数的使用方法吧
本帖最后由 BIO-张磊 于 2020-6-3 13:06 编辑
import pandas as pd
data = pd.read_csv("文件名")
#本来想用pandas自带的str.split属性,但是那个似乎更麻烦,所以可以用for循环依次替换
index = 0
for i in data.loc[:,"up_time"][:]:#type(i)为字符串
data.loc = i[:len(i)-3]#去掉秒
data.loc = int(i.split(":")) + round(int(i.split(":"))/60,2)#时间格式转换
index += 1
index = 0
for i in data.loc[:,"down_time"][:]:
data.loc = i[:len(i)-3]#去掉秒
data.loc = int(i.split(":")) + round(int(i.split(":"))/60,2)#时间格式转换
index += 1
#print(data)
plt.figure(num = 1)
data.plot.bar(x='date',y=['up_time','down_time'],stacked=True)
plt.show()
本帖最后由 BIO-张磊 于 2020-6-3 13:34 编辑
BIO-张磊 发表于 2020-6-3 13:05
至于你定义的函数,因为你传入的参数y是数据类型是str,你需要用到pd.to_datatime函数才能调用
y.hour,y.minue,y.second
我觉得可以修改成,不过我没怎么实验
def to_time(y):
h = pd.to_datetime(y).hour
m = pd.to_datetime(y).minute
s = pd.to_datetime(y).second
return int(h) + int(m/60) BIO-张磊 发表于 2020-6-3 13:05
感谢回帖,一会试下。
我刚学没多久,还是小萌新呢。一会给最佳啊,哈哈 BIO-张磊 发表于 2020-6-3 13:23
至于你定义的函数,因为你传入的参数y是数据类型是str,你需要用到pd.to_datatime函数才能调用
y.hour ...
刚才是列两个楼层的代码,都是说object是 datetime的格式没有split
BIO-张磊 发表于 2020-6-3 11:30
import pandas as pd
import matplotlib.pyplot as plt
#函数三:
def to_time(x):
return int(x)+round(int(x)/60,2)
data['up_time']=data['up_time'].astype('str').str.split(':')
data['down_time']=data['down_time'].astype('str').str.split(':')
页:
[1]