如何解析毫秒字段未填充为零的熊猫时间戳?

问题描述

我有一个 Pandas 数据框,其中的时间戳列格式为字符串。时间变量具有微秒级精度,但没有零填充。以下是时间戳的一些示例值。

import React,{ useState } from 'react'
import { useEffect } from 'react';
import unique_id from 'uniqid'
import FileUpload from "./../../components/FileUpload";

const InlineFileUpload = ({ onFilesChange }) => {
  const [files,setFiles] = useState([]);

  function onFinish(file,id) {
    const old_object = files.filter((file) => file._id == id)[0];
    console.log("old object on after upload",old_object);
  }

  const addFile = (file,id) => {
    const old_object = files.filter((file) => file._id == id)[0];
    const index = files.indexOf(old_object);
    const new_files = [...files];
    new_files.splice(index,1,{ ...old_object,buffer: file });
    setFiles(new_files);
  };

  useEffect(() => {
    const new_attachments = files.filter(({ buffer }) => buffer == undefined);
    if (new_attachments.length == 0) {
      setFiles([...files,{ _id: unique_id() }]);
    }

    const links = files.filter((file) => file.file !== undefined);

    if (links.length !== 0) {
      onFilesChange(links);
    }
  },[files]);

  return (
    <>
      {files.map((file) => {
          const { _id } = file;
        return ( <FileUpload
              key={_id}
              id={_id}
              onStart={(e) => addFile(e,_id)}
              onFinish={(e) => onFinish(e,_id)}
            />
        );
      })}
    </>
  );
};

export default InlineFileUpload

我想解析此列并具有日期时间格式。我尝试了其他 stackoverflow 线程中所述的以下选项,但没有奏效。

2015-05-12 05:25:23.904 UTC
2015-05-12 05:55:10.496544 UTC
2015-05-18 15:10:44.295 UTC
input_data['event_timestamp'] = pd.to_datetime(input_data['event_timestamp'],format="%Y-%m-%d %H:%M:%s.%-f %z")

ValueError: '-' is a bad directive in format '%Y-%m-%d %H:%M:%s.%-f %z'

如何将此变量解析为时间戳格式?

解决方法

通过填充“000”将毫秒转换为微秒:

>>> pd.to_datetime(df.event_timestamp.str.replace(r'(\.\d{3}) (\w+)',r'\g<1>000 \2',regex=True))

0   2015-05-12 05:25:23.904000+00:00
1   2015-05-12 05:55:10.496544+00:00
2   2015-05-18 15:10:44.295000+00:00
Name: event_timestamp,dtype: datetime64[ns,UTC]

来自 python 文档:

\g 使用对应的组号; \g 因此等价于 \2,但在诸如 \g0 之类的替换中不会产生歧义。 \20 将被解释为对组 20 的引用,而不是对组 2 后跟文字字符“0”的引用。反向引用 \g 替换了 RE 匹配的整个子字符串。