我有一个时间戳列,其格式为" 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,但数据集很小:)
谢谢
答案 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)
从此结果(即12
)5
减去倒计时到年初。 (实际上是年初之前的空间,但那没关系)。从一年前的空间开始,年份长度为五个字符,这是从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
也可以,但后者可以保存几个字符。