【问题标题】:Import duration from xlsx / convert object to duration从 xlsx 导入持续时间/将对象转换为持续时间
【发布时间】:2021-07-21 19:58:44
【问题描述】:

我正在使用 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 和 Longest 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')

【问题讨论】:

    标签: python excel pandas datetime timedelta


    【解决方案1】:

    背景: 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]
    

    【讨论】:

    • 谢谢你,但是当我尝试这个时,我收到以下错误:TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'Timestamp'
    • @voluzy hm df['AVG HVR'] 是什么类型?或许可以先尝试拨打df['AVG HVR'] = pd.to_datetime(df['AVG HVR'])
    • 据我所知类型是“对象”,这是我在尝试您的建议时得到的错误:TypeError: is not convertible to datetime跨度>
    • @voluzy 这与您的示例不符-例如1900-01-01 00:18:30.080000 不能是 datetime.time,因为它有一个日期
    • @voluzy 你也可以试试df['AVG HVR'] = pd.to_datetime(df['AVG HVR'].astype(str))
    猜你喜欢
    • 2020-09-05
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 2015-11-11
    • 1970-01-01
    相关资源
    最近更新 更多