【问题标题】:Vectorized pandas pd.Timestamp operation矢量化 pandas pd.Timestamp 操作
【发布时间】:2019-11-21 10:23:12
【问题描述】:

我正在尝试将存储为整数(yyyymmddHHMM 格式)的 pandas 数据帧的一列转换为时间戳。此列实际上是一个 pandas 数据框索引。考虑以下 MWE:

def get_digits(vector,first_digit,last_digit):
    return (vector // 10**last_digit) % 10**(first_digit-last_digit)

data = {'timestamp':[201911200830,201807131820],'value':[1,2]}
df_t=pd.DataFrame(data)

例如获取年份和月份的操作:

df_t.timestamp.values // 10**10
get_digits(df_t.timestamp.values,10,8)

产生array([2019, 2018])array([11, 7])

奇怪的是,pd.Timestamp 似乎不支持数组作为输入,因为该操作仅适用于单个输入,如下所示:

pd.Timestamp(df_t.timestamp.values[0] // 10**8, get_digits(df_t.timestamp.values[0],8,6), get_digits(df_t.timestamp.values[0],6,4), get_digits(df_t.timestamp.values[0],4,2), get_digits(df_t.timestamp.values[0],2,0))

如我所料,结果为Timestamp('2019-11-20 08:30:00')。但是,如果我删除 [0] 索引,它会在 MWE 中给我以下错误:

TypeError:无法将类型类“numpy.ndarray”的输入 [[2019 2018]] 转换为时间戳

关于如何勾勒此错误的任何想法?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用to_datetime 指定数据格式 - %Y%m%d%H%M 表示YYYYMMDDHHMM

    df_t['timestamp'] = pd.to_datetime(df_t['timestamp'], format='%Y%m%d%H%M')
    print (df_t)
                timestamp  value
    0 2019-11-20 08:30:00      1
    1 2018-07-13 18:20:00      2
    

    【讨论】:

      【解决方案2】:

      编辑这不是矢量化方法

      您可以使用pd.Series.apply 对列的值调用函数

      df_t.timestamp.apply(lambda ts: pd.Timestamp(ts // 10**8, get_digits(ts,8,6), get_digits(ts,6,4), get_digits(ts,4,2), get_digits(ts,2,0)))
      
      0   2019-11-20 08:30:00
      1   2018-07-13 18:20:00
      Name: timestamp, dtype: datetime64[ns]
      

      【讨论】:

      • 如果使用.apply 后面有循环,所以没有向量化。
      • @jezrael 感谢您的指出。我不知道矢量化函数。
      猜你喜欢
      • 2012-10-11
      • 1970-01-01
      • 2016-06-20
      • 2019-09-14
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      相关资源
      最近更新 更多