将时间戳转换为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) 

从这个结果(即125减去倒数到今年的开始。 (实际上是年初之前的空间,但那并不重要)。 从一年前的空间来看,年份是五个字符长,这是从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也可以,但后者保存了几个字符。