小咸鱼丶 发表于 2023-3-3 17:18

使用Pandas获取excel的时间会有问题

大佬们好,我再使用pandas获取excel过程中,发现pandas获取的时间如果大于24小时就会自动在我的时间前面加上一个1900-01-01   ,,这是一个问题





还有一个问题是这种时间怎么计算总时长呀,,我是两张表,用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的时间偏移量减去。示例代码如下:
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-3-6 16:06

获取的时长类型和获取的时长是这样的

小咸鱼丶 发表于 2023-3-6 16:13

单个时间类型是datetime.time

乖、表闹 发表于 2023-3-15 11:53

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()
    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        王五

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

页: [1] 2
查看完整版本: 使用Pandas获取excel的时间会有问题