将时间戳转换为dateExcel
我有一个时间戳列,格式为“Aug 01 2016 – 13:46”。 要格式化它像一个date,因为我不需要时间戳,我摆脱的空间和时间戳,
(SUBSTITUTE(LEFT(A2,LEN(A2)-8)," ",""))
然后再做
DATE(YEAR(RIGHT(C2,4)),MONTH(VLOOKUP(LEFT(C2,3),$H$2:$I$13,2,FALSE)),DAY(IF(ISNUMBER(MID(C2,4,1)),MID(C2,4,2),MID(C2,5,2))))
如果我在年份中抓取正确的4位数字,那么查看月份string,然后获取当天的中间数字(IF语句是因为偶尔月份会超过4个字符)。 我的结果是“1/12/05”不知道我做错了什么,并会很感激任何帮助! 通常会在R中使用strftime,但数据集很小:)
谢谢
请尝试:
=DATE(MID(A2,FIND(" -",A2)-5,5),VLOOKUP(LEFT(A2,3),$H$2:$I$13,2,0),MID(A2,FIND(" -",A2)-7,2))
可能有一个更短的版本,但我很好奇你不显示的不同格式(H2中是什么:I13),我试图“尊重”你的方法。
较短的版本(不需要VLOOKUP):
=DATEVALUE(MID(A2,FIND(" -",A2)-7,2)&"-"&LEFT(A2,3)&"-"&MID(A2,FIND("-",A2)-5,5))
上面的较长版本使用查找表(H2:I13),其中date标记的前三个字符被转换为表示相关月份的数字。 这避免了月份指示中的长度不一致可能会导致复杂化。
通过与空间/短划线对的参考点的关系来挑选年份和date。 相对于这一年,这个年份将会更快地开始四个字(而且是四个字)。
空间/短划线对(只是短划线就足以作为参考点)从第十二个字符开始,如下所示:
FIND(" –",A2)
从这个结果(即12
) 5
减去倒数到今年的开始。 (实际上是年初之前的空间,但那并不重要)。 从一年前的空间来看,年份是五个字符长,这是从A2
提取的string的长度:
MID(A2,FIND(" -",A2)-5,5)
以相似的方式提取当天(例如01
),然后提取三个片段(Year,VLOOKUP结果和Day)并作为参数馈送到= DATE函数中。
较短的版本通过在年份和date中间(与以长版本类似的方式提取)连接date戳的前三个字符来避免需要查找表,从以下获得:
LEFT(A2,3)
包围-
在每边。
(见LEFT ,实际上是其他地方使用的MID的一个简化forms)。
结果是一个string,但采用Excel识别的格式,而便利的函数= DATEVALUE可以转换为date/时间值。
如果数据更一致(即月份总是三个字母),这将会容易得多。
(编辑:这个答案可能不适用于Excel 2016之前的版本,正如下面评论中的@pnuts所指出的那样。)
解决scheme@pnuts给了很好的工作,但是这里要考虑一个更短,更简单的方法:
=VALUE(SUBSTITUTE(LEFT(A2,11)," ",", ",2))
这需要LEFT
11个字符( Aug 01 2016
),然后使用SUBSTITUTE
向第二个空格添加一个逗号(第二个" "
变成", "
)。 Excel非常聪明,可以将其解释为应用VALUE
时的date。
现在,如果由于不同的长度月份名称,一位数字date值或两位数年份值(@Pnuts的解决scheme将失败的边缘情况),您不能保证它将完全是11个字符,那么您可以修改它如下:
=VALUE(SUBSTITUTE(LEFT(A2,SEARCH("-",A2)-2)," ",", ",2))
这里唯一的区别是我们使用SEARCH("-",A2)
来find连字符的出现位置,并从那个位置备份两个字符,而不是使用硬编码的11
。
使用FIND
而不是SEARCH
工作。 这两者之间的区别在于FIND
区分大小写,而SEARCH
则不区分大小写。 在公式中使用DATEVALUE
而不仅仅是VALUE
也可以,但后者保存了几个字符。