使用Pandas获取excel的时间会有问题
大佬们好,我再使用pandas获取excel过程中,发现pandas获取的时间如果大于24小时就会自动在我的时间前面加上一个1900-01-01 ,,这是一个问题,
还有一个问题是这种时间怎么计算总时长呀,,我是两张表,用pandas左连接,然后想把每个组的总时长算出来 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) 这个问题出现的原因是因为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日,这样估计就能得到正确的时间值。 changhong8 发表于 2023-3-3 20:36
这个问题出现的原因是因为Excel存储时间的方式与Python的datetime对象有所不同。Excel中将时间存储为一个以 ...
了解,谢谢大佬 乖、表闹 发表于 2023-3-3 18:49
timedelta类型小时超过24的会算1天?我也不太会,你也没给代码,下边给的是个思路,硬凑应该能凑出这种的吧 ...
就是我是用pandas 获取的其他的excel表的时间,然后生成的新表,但是新表里面是每个班的时长,我是如何才能新加一列总每个年级的时长 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 代码是这样的 获取的时长类型和获取的时长是这样的 单个时间类型是datetime.time 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