问题描述
我有一个 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 匹配的整个子字符串。