我有一个时间戳列,格式为"Aug 01 2016 - 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,但数据集很小:)
谢谢
请尝试:
=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),其中日期戳的前三个字符被转换为表示相关月份的数字。这避免了由于月份指示中的长度不一致而导致的并发症。
年份和日期由它们与空格/破折号对参考点的关系选出。相对而言,一年将提前4个字符开始(长度为4)。
空格/破折号对(仅破折号作为参考点就足够了)从示例的第12个字符开始,位于:
FIND(" –",A2)
从这个结果(即12
)减去5
以回溯到年初。(实际上是一年开始前的空间,但这无关紧要)。从年份前面的空格中,年份有五个字符长,这是A2
中提取的字符串的长度:
MID(A2,FIND(" -",A2)-5,5)
以类似的方式提取日期(以01
为例),然后提取三部分(Year、VLOOKUP结果和day),并将其作为参数输入=DATE函数。
较短的版本通过在Year和Day的中间(以与长版本相似的方式提取)连接日期戳的前三个字符,从而避免了查找表的需要,这些字符来自:
LEFT(A2,3)
两边被-
包围。
(参见LEFT,它实际上是在其他地方使用的稍微简化的MID形式)。
结果为字符串,但格式为Excel可识别的格式,并且方便的函数=DATEVALUE可以将其转换为日期/时间值。
如果数据更一致(即总是三个字母表示Month),这将容易得多。
(编辑:@pnuts在下面的评论中指出,这个答案可能不适用于Excel 2016之前的版本)
@pnuts给出的解决方案很好,但这里有一个更短、更简单的方法可以考虑:
=VALUE(SUBSTITUTE(LEFT(A2,11)," ",", ",2))
使用LEFT
11个字符(Aug 01 2016
),然后使用SUBSTITUTE
在第二个空格中添加逗号(第二个" "
变成", "
)。然后,当应用VALUE
时,Excel足够智能地将其解释为日期。
现在,如果由于不同长度的月名、一位数的日值或两位数的年值(@pnuts的解决方案会失败的边缘情况),您不能保证它恰好是11个字符,那么您可以将其修改为以下内容:
=VALUE(SUBSTITUTE(LEFT(A2,SEARCH("-",A2)-2)," ",", ",2))
唯一的区别是我们使用SEARCH("-",A2)
来查找连字符出现的位置,并从该位置备份两个字符,而不是使用硬编码的11
。
使用FIND
代替SEARCH
也可以。两者之间的区别是FIND
区分大小写,而SEARCH
不区分大小写。在公式中使用DATEVALUE
而不是VALUE
也可以,但后者节省了几个字符。