矢量化熊猫pd.Timestamp操作

时间:2019-11-21 10:23:12

标签: python pandas

我正在尝试将存储为整数(yyyymmddHHMM格式)的熊猫数据帧的列转换为时间戳。该列实际上是熊猫数据框索引。考虑以下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]]转换为时间戳

关于如何消除此错误的任何想法?

2 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分:1)

  

编辑这不是向量化方法

您可以使用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]