我有一个 csv 文件,其中有一个日期列,其中包含各种形式的日期,如下所示:
dd-mm-yyyy
yyyy-mm-dd
yyyy-mm
yyyy
这些不规则数据位于单列中。
如何将它们全部转换为dd-mm-yyyy
并使用 Excel 公式从中提取年份?所需的输出如下:
Input Output
25-03-1954 25-03-1954
22-09-1987 22-09-1987
1990-01-25 25-01-1990
1968-11-15 15-11-1968
1919-01 01-01-1919
1873-02 01-02-1873
1945 01-01-1945
1933 01-01-1933
答案1
如果您真正需要的是年份,那么请使用@robinCTS 公式。
如果您希望结果是“真实的 Excel 日期”,并且
- 如果你的数据是文本而不是真实日期,
- 如果你的区域日期设置
DMY
是 - 并且该列的格式为
dd-mm-yyyy
那么你可以使用这个公式:
=IFERROR(IFERROR(IFERROR(DATEVALUE(A2),DATEVALUE(A2&"-01")),DATEVALUE(A2&"-01-01")),"illegal date format")
请注意,1900 年之前的日期在 Excel 中不能是真实日期,但可以表示为文本字符串。我将把调整公式的任务留给您。
如果您的输出需要国际化,以适应具有其他日期格式的国家/地区,那么 VBA 解决方案可能是最佳选择。如果无法实现,可以使用辅助列来拆分数据,然后适当地重新组合,或者使用非常复杂的公式来执行相同操作。
请注意,此 UDF 将输出实际日期或仅输出年份,具体取决于第二个可选参数。
Option Explicit
Function ConvertToDate(S As String, Optional Yr As Boolean = False) As Variant
Dim V
Dim dtTemp As Date
V = Split(S, "-")
Select Case UBound(V)
Case 0
dtTemp = DateSerial(V(0), 1, 1)
Case 1
dtTemp = DateSerial(V(0), V(1), 1)
Case 2
If Len(V(0)) = 4 Then
dtTemp = CDate(S)
Else
dtTemp = DateSerial(V(2), V(1), V(0))
End If
End Select
If Yr = True Then
ConvertToDate = Year(dtTemp)
Else
If Year(dtTemp) < 1900 Then
ConvertToDate = Format(dtTemp, "dd-mm-yyyy")
Else
ConvertToDate = dtTemp
End If
End If
End Function
两种方法都查看第一个段,并假设它是年份LEN > 4
,然后查看有多少个段来决定是否附加必要-01
的
VBA 解决方案将把 1900 年之前的日期输出为文本字符串。
答案2
由于输入数据包含 1900 年之前的日期,因此事情会变得有些棘手。处理此问题的最简单方法是专门处理日期的文本表示。
如果您实际上不需要完整日期,而只需要年份,请在行中的任意单元格中输入此基本公式2:2
:
=IFERROR(VALUE(LEFT(A2,4)),VALUE(RIGHT(A2,4)))
对于完整日期,公式稍微复杂一些:
=IF(MID(A2,3,1)="-",A2,CHOOSE((LEN(A2)-4)/3+1,"01-01","01"&MID(A2,5,3),RIGHT(A2,2)&MID(A2,5,3))&"-"&LEFT(A2,4))
解释:
完整日期公式的美化版本如下:
=
IF(
MID(A2,3,1)="-",
A2,
CHOOSE(
(LEN(A2)-4)/3+1,
"01-01",
"01"&MID(A2,5,3),
RIGHT(A2,2)&MID(A2,5,3)
)
&"-"&LEFT(A2,4)
)
这很简单。唯一有点棘手的是CHOOSE()
函数的第一个参数(LEN(A2)-4)/3+1
。它将输入日期字符串的长度映射到基于 1 的索引,即→ → 。[yyyy, yyyy-mm, yyyy-mm-dd, dd-mm-yyyy]
[4, 7, 10, 10]
[1, 2, 3, 3]
笔记:
- 美化后的公式确实可以起作用,只要输入即可。
注意事项:
- 这些公式假设所有输入日期都以文本形式存储。(这些公式可以轻松修改,以适应以序列号形式存储的日期。)
- 如果输入的日期包含前导/尾随空格,上述公式可能无法正常工作。它们肯定不会在日期字符串的其他地方使用空格(或其他字符)。将公式
A2
中的所有 s 替换为TRIM(A2)
,或者最好替换为SUBSTITUTE(A2," ","")
,将解决此问题。