Linux
在 CSV 文件中將日期格式從 MM/DD/YYYY HH:MM:SS am/pm 更改為 YYYY-MM-DD HH:MM:SS
我試圖隱藏我從供應商那裡獲得的這個 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
重擊解決方案
這是一個使用 GNU
date
實用程序的 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 腳本沒有。