Più formati di data in un'unica colonna in Excel


2

Ho un file CSV con una colonna di date con date in varie forme come segue:

dd-mm-yyyy

yyyy-mm-dd

yyyy-mm

yyyy

Questi dati irregolari sono in singole colonne.

Come posso convertirli tutti in dd-mm-yyyyed estrarre l'anno da loro usando la formula di Excel? L'output desiderato è il seguente:

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

Cosa intendi per conversione condizionale? Mostraci le condizioni!
Rajesh S,

@RajeshS Quello che intendevo per condizionale era la conversione in dd-mm-yyyybase al tipo di input nella cella.
Colture

se semplicemente si desidera convertire le date di input come mostra l'output può essere dome con TEXT excel Formula.
Rajesh S,

E cosa intendi con questo "ed estrai l'anno da loro usando la formula di Excel?" dal momento che la tua uscita ha tutti 3 data, mese e anno !!
Rajesh S,

TEXTpuò essere usato singolarmente se conosco il formato in input. Ho migliaia di celle di input (in più formati) che voglio convertire in output. Tuttavia non sono in grado di ottenere l'output. Una volta ottenuto l'output, posso estrarre l'anno usandoYEAR()
Crops

Risposte:


1

Se tutto ciò di cui hai veramente bisogno è l'Anno, usa la formula @robinCTS.

Se si desidera che il risultato sia "date Excel reali" e

  • se i tuoi dati sono TESTO e non date reali,
  • e se le impostazioni della data locale sono DMY,
  • e la colonna è formattata come dd-mm-yyyy

allora potresti usare questa formula:

=IFERROR(IFERROR(IFERROR(DATEVALUE(A2),DATEVALUE(A2&"-01")),DATEVALUE(A2&"-01-01")),"illegal date format")

Si noti che le date precedenti al 1900 non possono essere date reali in Excel, ma potrebbero essere rappresentate come stringhe TEXT. Lascerò a te modificare la formula.

Se il tuo output deve essere consapevole a livello internazionale di paesi che hanno altri formati di data, una soluzione VBA potrebbe essere la migliore. Se ciò non è possibile, è possibile utilizzare colonne di supporto per suddividere i dati e riassemblare in modo appropriato oppure utilizzare una formula molto complessa per fare lo stesso.

Si noti che questo UDF produrrà la data effettiva o solo l'anno, a seconda del secondo argomento opzionale.

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

Entrambi i metodi guardano il primo segmento, e assumono si tratta di un anno, se LEN > 4, e poi guardare il numero di segmenti di decidere se aggiungere il necessario -01's

La soluzione VBA produrrà date precedenti al 1900 come stringa di testo.


OP non ha mai richiesto VBA, OP ha bisogno di Excel Formula !!
Rajesh S,

1
@RajeshS E questa è stata la prima parte della risposta. Ma ho anche discusso di altre opzioni. Questo non è solo un "servizio code for me" gratuito, ma esiste piuttosto per fornire informazioni sia al PO che ad altri che possono successivamente cercare risposte nel DB. Pertanto, entrambe le spiegazioni degli algoritmi, nonché metodi alternativi per risolvere un problema, possono essere utili.
Ron Rosenfeld,

1

Poiché i tuoi dati di input contengono date precedenti al 1900, le cose diventano un po 'più complicate. Il modo più semplice per gestirlo è lavorare esclusivamente con le rappresentazioni testuali delle date.

Se in realtà non hai bisogno della data completa, ma richiedi solo l'anno, inserisci questa formula di base in qualsiasi cella della riga 2:2:

=IFERROR(VALUE(LEFT(A2,4)),VALUE(RIGHT(A2,4)))

Per la data completa, la formula è un po 'più complicata:

=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))

Spiegazione:

La versione predefinita della formula della data completa è la seguente:

=
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)
)

È abbastanza semplice. L'unica cosa leggermente complicata è il primo argomento della CHOOSE()funzione (LEN(A2)-4)/3+1,. In questo modo le lunghezze delle stringhe della data di input vengono mappate su indici basati su 1, ovvero → → .[yyyy, yyyy-mm, yyyy-mm-dd, dd-mm-yyyy][4, 7, 10, 10][1, 2, 3, 3]

Appunti:

  • La formula predefinita funziona effettivamente se è stata inserita.

Avvertenze:

  • Le formule presuppongono che tutte le date di input siano memorizzate come testo. (Le formule sono facilmente modificabili per soddisfare le date memorizzate come numeri di serie.)
  • Se le date di input contengono spazi iniziali / finali, le formule precedenti potrebbero non funzionare correttamente. Non funzioneranno sicuramente con spazi (o altri caratteri) altrove nelle stringhe di date. Sostituendo tutti A2i messaggi nelle formule con TRIM(A2), o meglio ancora con SUBSTITUTE(A2," ",""), si risolverà questo problema.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.