如何解决从 xlsx 导入持续时间/将对象转换为持续时间
我正在使用 Python 抓取大量 xlsx 文件(均采用相同格式)并将它们合并为一个文件,准备使用
进一步分析In [206]:
files = glob.glob(path + "/*.xlsx")
df= pd.DataFrame()
df = pd.concat([pd.read_excel(fp,index_col = 0,header = 3).assign(New=os.path.basename(fp)) for fp in files])
df.dtypes
Out[206]:
HVR\n>60 int64
AVG HVR object
Longest HVR datetime64[ns]
AVG HVR 和最长 HVR 都是持续时间,但 AVG HVR 中的某些字段包含毫秒,因此对象中的数据类型如下:
Site AVG HVR
Leighton 1900-01-01 00:18:30.080000
Macclesfield 1900-01-01 00:23:09
我需要在 excel 中将它们作为持续时间进行处理,因此需要将它们转换为 timedelta 格式或以正确的格式从 xlsx 导入它们。
我尝试了以下所有方法都无济于事,
df['AVG HVG'] = pd.to_timedelta(df['AVG HVG'])
>>> TypeError: Expected unicode,got Timestamp
>>> ValueError: Invalid type for timedelta scalar: <class 'pandas._libs.tslibs.timestamps.Timestamp'>
datetime.combine(date.min,df['AVG HVG']) - datetime.min
>>> TypeError: combine() argument 2 must be datetime.time,not Series
df['AVG HVG'] = df['AVG HVG'] - datetime.time(1900,1,1)
>>> TypeError: descriptor 'time' for 'datetime.datetime' objects doesn't apply to a 'int' object
df['AVG HVR'] = df['AVG HVR'].dt.strftime('%H:%M:%S')
>>> KeyError: 'AVG HVR'
df['AVG HVR\n(HH:MM:SS)'] = df['AVG HVR\n(HH:MM:SS)'].astype('|S19')
解决方法
背景: Excel 将日期存储为序列日期,默认情况下自 1900 年以来的天数。另见:Dates and Times in Excel。但是 Excel 中没有专门的持续时间类型,它们也只是 Excel 中的日期。因此,在导入到 Pandas 数据框时,您将获得 datetime
而不是 timedelta
。
Datetime 到 Timedelta: 而不是尝试转换为 timedelta(未为 datetime -> timedelta 定义),只需从 datetime 列中减去参考日期即可获取 timedelta 列。
例如:
import pandas as pd
df = pd.DataFrame({'AVG HVR': [pd.Timestamp("1900-01-01 00:18:30.080000"),pd.Timestamp("1900-01-01 00:23:09")]})
df['AVG HVR'] = df['AVG HVR'] - pd.Timestamp('1900-01-01')
df['AVG HVR']
0 0 days 00:18:30.080000
1 0 days 00:23:09
Name: AVG HVR,dtype: timedelta64[ns]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。