吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 950|回复: 10
收起左侧

[求助] 使用Pandas获取excel的时间会有问题

[复制链接]
小咸鱼丶 发表于 2023-3-3 17:18
大佬们好,我再使用pandas获取excel过程中,发现pandas获取的时间如果大于24小时就会自动在我的时间前面加上一个1900-01-01   ,,这是一个问题



屏幕截图 2023-03-03 171156.png 屏幕截图 2023-03-03 171445.png 屏幕截图 2023-03-03 171532.png

还有一个问题是这种时间怎么计算总时长呀,,我是两张表,用pandas左连接,然后想把每个组的总时长算出来

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

乖、表闹 发表于 2023-3-3 18:49
timedelta类型小时超过24的会算1天?我也不太会,你也没给代码,下边给的是个思路,硬凑应该能凑出这种的吧
from datetime import timedelta

t1 = timedelta(hours=15, minutes=0, seconds=0)  # 15:00:00  第一个时间
t2 = timedelta(hours=10, minutes=0, seconds=0)  # 10:00:00  第二个时间
t3 = t1 + t2

# 计算总共的秒数
total_seconds = t3.total_seconds()

# 计算小时、分钟、秒
hours = int(total_seconds // 3600)
minutes = int((total_seconds % 3600) // 60)
seconds = int(total_seconds % 60)

# 格式化输出结果
result = f'{hours:02d}:{minutes:02d}:{seconds:02d}'

# 输出结果
print(result)
changhong8 发表于 2023-3-3 20:36
这个问题出现的原因是因为Excel存储时间的方式与Python的datetime对象有所不同。Excel中将时间存储为一个以1900年1月1日为起点的浮点数,因此在Pandas读取Excel文件时,如果时间大于24小时,就会被识别为日期和时间,自动加上了1900-01-01。
为了解决这个问题,可以使用Pandas的to_datetime函数将Excel中的浮点数转换为Python的datetime对象,并将1900-01-01的时间偏移量减去。示例代码如下:
[Python] 纯文本查看 复制代码
import pandas as pd
import datetime as dt

# 读取Excel文件
df = pd.read_excel('file.xlsx')

# 将浮点数转换为datetime对象
df['date_time'] = pd.to_datetime(df['date'], unit='d', origin=dt.datetime(1899, 12, 30))

# 输出结果
print(df['date_time'])

使用Pandas的to_datetime函数将Excel中的浮点数转换为datetime对象,使用unit参数指定浮点数以天为单位,使用origin参数指定时间偏移量为1899年12月30日,这样估计就能得到正确的时间值。
 楼主| 小咸鱼丶 发表于 2023-3-6 15:24
changhong8 发表于 2023-3-3 20:36
这个问题出现的原因是因为Excel存储时间的方式与Python的datetime对象有所不同。Excel中将时间存储为一个以 ...

了解,谢谢大佬
 楼主| 小咸鱼丶 发表于 2023-3-6 15:40
乖、表闹 发表于 2023-3-3 18:49
timedelta类型小时超过24的会算1天?我也不太会,你也没给代码,下边给的是个思路,硬凑应该能凑出这种的吧 ...

就是我是用pandas 获取的其他的excel表的时间,然后生成的新表,但是新表里面是每个班的时长,我是如何才能新加一列总每个年级的时长
 楼主| 小咸鱼丶 发表于 2023-3-6 15:45
changhong8 发表于 2023-3-3 20:36
这个问题出现的原因是因为Excel存储时间的方式与Python的datetime对象有所不同。Excel中将时间存储为一个以 ...

大佬我试了但是会报错

Name: 时长, dtype: object' is not compatible with origin='1899-12-30 00:00:00'; it must be numeric with a unit specified
 楼主| 小咸鱼丶 发表于 2023-3-6 16:01
代码是这样的
屏幕截图 2023-03-06 160117.png
 楼主| 小咸鱼丶 发表于 2023-3-6 16:06
获取的时长类型和获取的时长是这样的
屏幕截图 2023-03-06 160611.png
 楼主| 小咸鱼丶 发表于 2023-3-6 16:13
单个时间类型是datetime.time
乖、表闹 发表于 2023-3-15 11:53
[Python] 纯文本查看 复制代码
import pandas as pd


def get_one():
    # 读取数据
    pdf_c = pd.read_excel(r".\a2c.xlsx", usecols=['用户', '时长'], dtype={'时长': str})
    pdf_e = pd.read_excel(r".\a2e.xlsx", usecols=['用户', '时长'], dtype={'时长': str})
    pd.set_option('display.max_rows', None)
    # pdf_C['时长'] = pd.to_datetime(pdf_C['时长'],unit='d',origin=dt.datetime(1899,12,30))for i in pdf_c['时长']:
    # for i in pdf_c['时长']:
    #     print(type(i))
    pdf_l = pd.concat([pdf_c, pdf_e])
    return pdf_l


def get_two():
    pdfT = pd.read_excel(".\MemberList_admin12m.xlsx", usecols=['部门名称', '用户'])
    return pdfT


def compound():
    pd1 = get_one()
    pd2 = get_two()
    tab = pd2.merge(pd1, how='left', on='用户')
    # print(type(tab))
    # 将时间数据转换成 timedelta 类型
    tab['时长'] = pd.to_timedelta(tab['时长'])
    # 计算时长总和
    result = tab.groupby(['部门名称', '用户'])['时长'].sum().reset_index()
    # 将时间数据格式化为 HH:MM:SS 格式
    result['时长'] = result['时长'].apply(lambda x: str(int(x.total_seconds() // 3600)).zfill(2) + ':' +
                                                    str(int((x.total_seconds() % 3600) // 60)).zfill(2) + ':' +
                                                    str(int(x.total_seconds() % 60)).zfill(2))
    print(result)
    result.to_excel('result.xlsx', index=False)


if __name__ == '__main__':
    compound()


输出结果
部门名称        用户        时长
部门1        张三        27:12:00
部门2        李四        06:04:00
部门3        王五        01:01:01


excel表格期中一个为下边这种格式
用户        时长
张三        5:06:00
李四        3:02:00
王五        1:01:01
部门数据为这种
部门名称        用户
部门1        张三
部门2        李四
部门3        王五

最近没上论坛,不知道你还用不用的上,这个是用户求和,你可以参考着改一下
建议下次直接给源码和元始数据模板,然后再列个想得到什么样的数据,这样问题会少一些

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-11 14:58

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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