Linux

在 CSV 文件中將日期格式從 MM/DD/YYYY HH:MM:SS am/pm 更改為 YYYY-MM-DD HH:MM:SS

  • October 27, 2018

我試圖隱藏我從供應商那裡獲得的這個 csv 文件的日期格式,以便我可以將數據上傳到我的 Google Bigquery。我正在使用來自 Google Cloud Console 的虛擬機。

數據看起來像這樣:

Name ,Phone ,SalesDate ,Venue ,NoOfUnits ,ModifiedDatae

Victor ,5555555 ,12/6/2013 10:26:32 AM , Colosseum ,1 ,12/8/2013 1:05:45 PM

我正在嘗試以以下格式製作它:

Name ,Phone ,SalesDate ,Venue ,NoOfUnits ,ModifiedDatae

Victor ,5555555 ,2013-12-6 10:26:32 ,Colosseum,1 ,2013-12-8 13:05:45

我知道我可以使用 sed 或 awk。

我編寫了一個 Python 腳本和一個 Bash 腳本,它們應該可以滿足您的需求。

Python 解決方案

這是一個 Python 腳本,可將所有時間欄位從一種格式轉換為另一種格式,如問題中所述:

#!/usr/bin/env python3
# -*- coding: ascii -*-
"""reformat_time.py

Change date format from:

   MM/DD/YYYY HH:MM:SS am/pm

to:

   YYYY-MM-DD HH:MM:SS

in a CSV file
"""

import csv
from datetime import date
from datetime import datetime
import sys

# Open the file (taken as a command-line argument)
with open(sys.argv[1], 'r') as csvfile:

   # Parse the CSV data
   csvreader = csv.reader(csvfile, delimiter=',', quotechar='"')

   # Iterate over the rows
   for row in csvreader:

       # Iterate over the columns of each row
       for index, col in enumerate(row):

           # Try to parse and convert each column
           try:
               _datetime = datetime.strptime(col, "%m/%d/%Y %H:%M:%S %p")
               newcol = _datetime.strftime("%Y-%m-%d %H:%M:%S")

           # If parsing fails, leave the column unchanged
           except ValueError:
               newcol = col

           # Update the column value
           row[index] = newcol

       # Output the updated row
       print(','.join(row))

假設您的 CSV 文件被呼叫data.csv並包含以下行(取自您的文章):

Victor,5555555,12/6/2013 10:26:32 AM,Colosseum,1,12/8/2013 1:05:45 PM

然後你可以像這樣執行腳本:

python reformat_time.py data.csv

這將產生以下輸出:

Victor,5555555,2013-12-06 10:26:32,Colosseum,1,2013-12-08 01:05:45

重擊解決方案

這是一個使用 GNUdate實用程序的 Bash 腳本,它具有(幾乎)相同的效果:

#!/bin/bash
# reformat_time.sh

# Loop over the lines of the file
while read -r line; do

   # Extract the field values for each row
   Name="$(echo ${line} | cut -d, -f1)";
   Phone="$(echo ${line} | cut -d, -f2)";
   SalesDate="$(echo ${line} | cut -d, -f3)";
   Venue="$(echo ${line} | cut -d, -f4)";
   NoOfUnits="$(echo ${line} | cut -d, -f5)";
   ModifiedDate="$(echo ${line} | cut -d, -f6)";

   # Convert the time-fields from the old format to the new format
   NewSalesDate="$(date -d "${SalesDate}" "+%Y-%m-%d %H:%M:%S")";
   NewModifiedDate="$(date -d "${ModifiedDate}" "+%Y-%m-%d %H:%M:%S")";

   # Output the updated row
   echo "${Name},${Phone},${NewSalesDate},${Venue},${NoOfUnits},${NewModifiedDate}";

done < "$1"

你可以像這樣執行它:

bash reformat_time.sh data.csv

它將產生以下輸出:

Victor ,5555555 ,2013-12-06 10:26:32, Colosseum ,1 ,2013-12-08 13:05:45

請注意,Bash 腳本要脆弱得多。它不進行錯誤處理,只影響第 3 和第 6 欄位。它還保留了欄位分隔符周圍的空格,而上面的 Python 腳本沒有。

引用自:https://unix.stackexchange.com/questions/446764