鱼C论坛

 找回密码
 立即注册
查看: 1745|回复: 6

[已解决]pandas处理excel里的时间问题

[复制链接]
发表于 2020-6-3 11:30:47 | 显示全部楼层 |阅读模式
5鱼币
win10 64位
pycharm

一、要做的事:

1.读取excel中的时间数据;
2.把表格中的up_time, down_time转换成小时数。比如 8:30:00转成8.5小时整形数字
3.画叠加柱状图,up_time 在下边down_time上边的堆叠图。

二、问题:
现在在code里写了两个函数,发现excel里的数据是object类型。用这两个函数都不能用apply操作转换。
请帮忙提出实现一功能,需要如何修改或者思路。

  1. import pandas as pd
  2. import matplotlib.pyplot as plt

  3. # #函数一:字符串类型的时间转换
  4. # def to_time(x):
  5. #     h,m,s=x.strip().split(':')
  6. #     return int(h)+int(m/60)

  7. #函数二:时间类型转换成
  8. def to_time(y):
  9.     h = y.hour
  10.     m = y.minute
  11.     s = y.second
  12.     return int(h)+int(m/60)

  13. data = pd.read_excel(r'demo.xlsx')
  14. # print(data)
  15. print(data.dtypes)

  16. #计算开车时间和停车时间
  17. data = data.loc[data.up_time.apply(to_time)].loc[data.down_time.apply(to_time)]
  18. print('1')
  19. print(data)
  20. print('2')
  21. #绘制叠加柱状图
  22. data.plot.bar(x='date',y=['up_time','down_time'],stacked=True)

  23. #设置标题
  24. plt.title ('up_time vs down_time per shift',fontsize=16,fontweight='bold')
  25. #紧凑型标签
  26. plt.tight_layout()
  27. plt.show()
复制代码


最佳答案
2020-6-3 11:30:48
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函数的使用方法吧

Capture.JPG

最佳答案

查看完整内容

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='da ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-3 11:30:48 | 显示全部楼层    本楼为最佳答案   
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函数的使用方法吧

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-3 13:05:51 | 显示全部楼层
本帖最后由 BIO-张磊 于 2020-6-3 13:06 编辑
  1. import pandas as pd
  2. data = pd.read_csv("文件名")


  3. #本来想用pandas自带的str.split属性,但是那个似乎更麻烦,所以可以用for循环依次替换
  4. index = 0
  5. for i in data.loc[:,"up_time"][:]:#type(i)为字符串
  6.         data.loc[index,"up_time"] = i[:len(i)-3]#去掉秒
  7.         data.loc[index,"up_time"] = int(i.split(":")[0]) + round(int(i.split(":")[1])/60,2)#时间格式转换
  8.         index += 1

  9. index = 0
  10. for i in data.loc[:,"down_time"][:]:
  11.         data.loc[index,"down_time"] = i[:len(i)-3]#去掉秒
  12.         data.loc[index,"down_time"] = int(i.split(":")[0]) + round(int(i.split(":")[1])/60,2)#时间格式转换
  13.         index += 1

  14. #print(data)

  15. plt.figure(num = 1)
  16. data.plot.bar(x='date',y=['up_time','down_time'],stacked=True)
  17. plt.show()


复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-3 13:23:34 | 显示全部楼层
本帖最后由 BIO-张磊 于 2020-6-3 13:34 编辑


至于你定义的函数,因为你传入的参数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)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-3 14:55:08 From FishC Mobile | 显示全部楼层
BIO-张磊 发表于 2020-6-3 13:05

感谢回帖,一会试下。
我刚学没多久,还是小萌新呢。一会给最佳啊,哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-3 20:50:17 | 显示全部楼层
BIO-张磊 发表于 2020-6-3 13:23
至于你定义的函数,因为你传入的参数y是数据类型是str,你需要用到pd.to_datatime函数才能调用
y.hour ...

刚才是列两个楼层的代码,都是说object是 datetime的格式没有split
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-4 00:08:44 | 显示全部楼层
BIO-张磊 发表于 2020-6-3 11:30
import pandas as pd
import matplotlib.pyplot as plt
  1. #函数三:
  2. def to_time(x):
  3.     return int(x[0])+round(int(x[1])/60,2)

  4. data['up_time']=data['up_time'].astype('str').str.split(':')
  5. data['down_time']=data['down_time'].astype('str').str.split(':')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-21 05:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表