将时间戳转换为日期Excel

时间:2016-08-12 01:50:04

标签: excel date

我有一个时间戳列,其格式为" 2016年8月1日 - 13:46"。要将其格式化为日期,因为我不需要时间戳,我可以删除空格和时间戳,

(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位数作为年份,为月份字符串执行vlookup,然后获取当天的中间数字(IF语句是因为偶尔月份将超过4个字符)。我的结果是" 1/12/05"无法弄清楚我做错了什么,并且非常感谢任何帮助!通常在R中使用strftime,但数据集很小:)

谢谢

2 个答案:

答案 0 :(得分:2)

请尝试:

=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),其中日期戳的前三个字符将转换为表示相关月份的数字。这避免了月份指示中长度不一致可能带来的并发症。

通过他们与空格/短划线对的参考点的关系来挑选年份和日期。相对于年,将更快地开始四个字符(并且长度为四)。

空格/短划线对(只是短划线就足够作为参考点)从示例的第12个字符开始,位于:

FIND(" –",A2)  

从此结果(即125减去倒计时到年初。 (实际上是年初之前的空间,但那没关系)。从一年前的空间开始,年份长度为五个字符,这是从A2中提取的字符串的长度:

MID(A2,FIND(" -",A2)-5,5)  

以相似的方式提取日期(示例01,然后将三个部分(年,VLOOKUP结果和日)提取并作为参数提供给=DATE函数。

较短的版本避免了concatenating的查找表,在年和日的中间(以与长版本类似的方式提取),获得日期戳的前三个字符,获得来自:

LEFT(A2,3)

每边都被-包围。

(参见LEFT,这实际上是其他地方使用的MID的略微简化形式)。

结果是一个字符串,但格式为Excel,另一个函数=DATEVALUE可以转换为日期/时间值。

如果数据更加一致(即总是三个月的字母),这将会容易得多。

答案 1 :(得分:1)

(编辑:这个答案可能不适用于Excel 2016之前的版本,正如@pnuts在下面的评论中指出的那样。)

解决方案@pnuts的工作正常,但这里有一个更简单,更简单的方法:

=VALUE(SUBSTITUTE(LEFT(A2,11)," ",", ",2))

这需要LEFT 11个字符(Aug 01 2016),然后使用SUBSTITUTE向第二个空格添加逗号(第二个" "变为", " )。 Excel非常智能,可以在应用VALUE时将其解释为日期。

现在,如果由于长度不同的月份名称,一位数日期值或两位数年份值(@pnuts的解决方案失败的边缘情况)而无法保证它将正好是11个字符,那么您可以将其修改为以下内容:

=VALUE(SUBSTITUTE(LEFT(A2,SEARCH("-",A2)-2)," ",", ",2))

这里唯一的区别是我们使用SEARCH("-",A2)来查找连字符出现的位置,并从该位置备份两个字符,而不是使用硬编码11

使用FIND代替SEARCH也可以。这两者之间的区别在于FIND区分大小写,而SEARCH则不区分大小写。在公式中使用DATEVALUE而不仅仅使用VALUE也可以,但后者可以保存几个字符。