代码之家  ›  专栏  ›  技术社区  ›  Medulla Oblongata

熊猫将48个交易时段转换为一天中的时间

  •  -1
  • Medulla Oblongata  · 技术社区  · 4 年前

    import numpy as np
    import pandas as pd
    import datetime
    from datetime import date, datetime, time, timedelta
    import pyarrow as pa
    import pyarrow.parquet as pq
    
    # my dataset - 2 days
    df = pd.DataFrame()
    df['date'] = pd.to_datetime(['2020-10-21']*48+['2020-10-22']*48, format='%Y-%m-%d')
    trp = np.arange(1,49,1) # 48 trading periods in each day
    df['tp'] = pd.DataFrame(np.concatenate((trp,trp)))
    df = df.set_index('date')
    midnight = df.index.time
    
    T = df.tp.values
    tstep = pd.Timedelta(minutes=(30*(T-1)))
    df['time'] = pd.to_datetime(midnight + tstep)
    
    #for jj in range(len(demand)):
    #    T = df.tp.values[jj]
    #    tstep = pd.Timedelta(minutes=(30*(T-1)))
    #    time0 = midnight + pd.to_datetime(tstep)
    #    #df['time'] = df['time'].append(tstep)
    
    df.head()
    

    我一直在犯错误

    TypeError                                 Traceback (most recent call last)
    <ipython-input-122-0b6c5efa5538> in <module>()
          8 
          9 T = df.tp.values
    ---> 10 tstep = pd.Timedelta(minutes=(30*(T-1)))
         11 df['time'] = pd.to_datetime(midnight + tstep)
         12 
    
    pandas/_libs/tslibs/timedeltas.pyx in pandas._libs.tslibs.timedeltas.Timedelta.__new__()
    
    pandas/_libs/tslibs/timedeltas.pyx in pandas._libs.tslibs.timedeltas._to_py_int_float()
    
    TypeError: Invalid type <class 'numpy.ndarray'>. Must be int or float.
    

    我不知道如何解决这个问题,即使尝试了for循环。

    1 回复  |  直到 4 年前
        1
  •  1
  •   Cimbali    4 年前

    错误很明显: pd.Timestamp 接受标量值(float或int),而不是数组作为分钟。

    astype

    >>> df.tp.astype('timedelta64[m]')
    date
    2020-10-21   0 days 00:01:00
    2020-10-21   0 days 00:02:00
    2020-10-21   0 days 00:03:00
    2020-10-21   0 days 00:04:00
    2020-10-21   0 days 00:05:00
                       ...      
    2020-10-22   0 days 00:44:00
    2020-10-22   0 days 00:45:00
    2020-10-22   0 days 00:46:00
    2020-10-22   0 days 00:47:00
    2020-10-22   0 days 00:48:00
    Name: tp, Length: 96, dtype: timedelta64[ns]
    

    在这里 timedelta64[m] df.index 直接代替 df.index.time 使用datetime对象。从那里很容易:

    >>> df['time'] = df.index + (30 * (df.tp - 1)).astype('timedelta64[m]')
    >>> df
                tp                time
    date                              
    2020-10-21   1 2020-10-21 00:00:00
    2020-10-21   2 2020-10-21 00:30:00
    2020-10-21   3 2020-10-21 01:00:00
    2020-10-21   4 2020-10-21 01:30:00
    2020-10-21   5 2020-10-21 02:00:00
    ...         ..                 ...
    2020-10-22  44 2020-10-22 21:30:00
    2020-10-22  45 2020-10-22 22:00:00
    2020-10-22  46 2020-10-22 22:30:00
    2020-10-22  47 2020-10-22 23:00:00
    2020-10-22  48 2020-10-22 23:30:00
    
    [96 rows x 2 columns]