如何在python中将连续数字转换为日期时间
我加载了一个matlab文件,时间是一个numpy数组,如下所示:如何在python中将连续数字转换为日期时间,python,string,datetime,Python,String,Datetime,我加载了一个matlab文件,时间是一个numpy数组,如下所示: array([ 2.00301010e+09, 2.00301010e+09, 2.00301010e+09, ..., 2.00912312e+09, 2.00912312e+09, 2.00912312e+09]) 值,例如数组中的第一个值表示 2003010101.0 = 2003 (year) 01 (month) 01 (day) 01(hr) 如何将这个连续字符串(之间没有空格)
array([ 2.00301010e+09, 2.00301010e+09, 2.00301010e+09, ...,
2.00912312e+09, 2.00912312e+09, 2.00912312e+09])
值,例如数组中的第一个值表示
2003010101.0 = 2003 (year) 01 (month) 01 (day) 01(hr)
如何将这个连续字符串(之间没有空格)转换为datetime?前面的问题总是用“-”或“空格”分隔的字符串来解决。提前感谢!出于某种奇怪的原因,您的日期时间被编码成了一个浮点,使用的规则如下所示:
year * 1e6 + month * 1e4 + day * 1e2 + hour
ymdh = int(f)
y, mdh = divmod(ymdh, 1000000)
m, dh = divmod(mdh, 1000)
d, h = divmod(dh, 10)
s = str(f).translate({c: None for c in '.E+'})
因此,您可以通过反转该算法对其进行解码。首先将其转换为int
,以避免任何舍入问题,可能会更干净。因此,类似这样的情况:
year * 1e6 + month * 1e4 + day * 1e2 + hour
ymdh = int(f)
y, mdh = divmod(ymdh, 1000000)
m, dh = divmod(mdh, 1000)
d, h = divmod(dh, 10)
s = str(f).translate({c: None for c in '.E+'})
当然,你可以让它更简洁,但我想让它尽可能容易理解
这有一个(值得怀疑的)优点,即您可以一次跨整个阵列执行此操作:
ymdh = np.astype(f, np.int)
y, mdh = divmod(ymdh, 1000000)
m, dh = divmod(mdh, 1000)
d, h = divmod(dh, 10)
最后,您得到了四个独立的y、m、d和h数组;您可以将它们堆叠起来,或者将它们转换为一个结构数组,或者将它们压缩成一个接一个的形式,以提供给一个普通的Python函数,如datetime.datetime
另一种方法是将其转换为字符串,然后使用在其他答案中找到的相同字符串日期解析代码。这里唯一的技巧是数字采用科学格式,因此您需要删除一些额外的字符。类似于以下内容:
year * 1e6 + month * 1e4 + day * 1e2 + hour
ymdh = int(f)
y, mdh = divmod(ymdh, 1000000)
m, dh = divmod(mdh, 1000)
d, h = divmod(dh, 10)
s = str(f).translate({c: None for c in '.E+'})
现在,您只需要使用数字
YYYYMMDDHH
,这很简单。出于某种奇怪的原因,您的日期时间被编码成一个浮点数,使用的规则如下所示:
year * 1e6 + month * 1e4 + day * 1e2 + hour
ymdh = int(f)
y, mdh = divmod(ymdh, 1000000)
m, dh = divmod(mdh, 1000)
d, h = divmod(dh, 10)
s = str(f).translate({c: None for c in '.E+'})
因此,您可以通过反转该算法对其进行解码。首先将其转换为int
,以避免任何舍入问题,可能会更干净。因此,类似这样的情况:
year * 1e6 + month * 1e4 + day * 1e2 + hour
ymdh = int(f)
y, mdh = divmod(ymdh, 1000000)
m, dh = divmod(mdh, 1000)
d, h = divmod(dh, 10)
s = str(f).translate({c: None for c in '.E+'})
当然,你可以让它更简洁,但我想让它尽可能容易理解
这有一个(值得怀疑的)优点,即您可以一次跨整个阵列执行此操作:
ymdh = np.astype(f, np.int)
y, mdh = divmod(ymdh, 1000000)
m, dh = divmod(mdh, 1000)
d, h = divmod(dh, 10)
最后,您得到了四个独立的y、m、d和h数组;您可以将它们堆叠起来,或者将它们转换为一个结构数组,或者将它们压缩成一个接一个的形式,以提供给一个普通的Python函数,如datetime.datetime
另一种方法是将其转换为字符串,然后使用在其他答案中找到的相同字符串日期解析代码。这里唯一的技巧是数字采用科学格式,因此您需要删除一些额外的字符。类似于以下内容:
year * 1e6 + month * 1e4 + day * 1e2 + hour
ymdh = int(f)
y, mdh = divmod(ymdh, 1000000)
m, dh = divmod(mdh, 1000)
d, h = divmod(dh, 10)
s = str(f).translate({c: None for c in '.E+'})
现在你只得到了数字
YYYYMMDDHH
,这很简单。你试过没有分隔符的数字吗?而且,它看起来像一个浮点,而不是一个字符串。这是一种非常奇怪的存储日期时间的方法…但是它可以被解析,或者通过做一些同样奇怪的数学运算,或者只是转换成一个字符串,删除多余的字符,然后使用从您看到的其他答案中选择代码。@roganjosh抱歉,我再次编辑了问题。@abarnert抱歉,我再次编辑了问题。您尝试过没有分隔符的问题吗?而且,它看起来像一个浮点,而不是一个字符串。这是一种非常奇怪的存储日期时间的方法……但它可以通过做一些同样奇怪的数学运算或转换为stri来解析ng,删除多余字符,并使用您看到的其他答案之一的代码。@roganjosh抱歉我再次编辑了问题。@abarnert抱歉我再次编辑了问题。谢谢!这确实是非常清楚的解释和解决方案:)谢谢!这确实是非常清楚的解释和解决方案:)