簡體   English   中英

將字符串類型的 CSV 行日期記錄轉換為 unixstamp 並加載到 json - Python

[英]Convert CSV row date record of type string into unixstamp and load into json - Python

我正在嘗試將日期從我的 csv 轉換為 Unix 戳並加載到 json

"bFlag","date"
"TRUE", "10/8/2022"
"FALSE","11/8/2022"

所需的 output:

{
 {
  bFlag: True
  date : 1660082400000
 },
 {
  bFlag: False
  date : 1660168800000
 }
}

我的代碼,

import csv
import json
import time
import datetime


#### Transforming Date String into Unix Timestamp ###
def transform_date(ts):
    return time.mktime(datetime.datetime.strptime(ts, "%d/%m/%Y").timetuple()) * 1000


def csv_to_json(csvFilePath, jsonFilePath):
    jsonArray = []

    # read csv file
    with open(csvFilePath, encoding='utf-8') as csvf:

        ###### Transforming True and False strings into Boolean values
        csvReader = [[True if row[field] == 'TRUE' else
                      False if row[field] == 'FALSE' else
                     row[field] for field in row] for row in csv.DictReader(csvf)]


        
        for row in csvReader:
            # adding python dict to json array
            transRow = transform_row(row)
            jsonArray.append(transRow)

    
    with open(jsonFilePath, 'w', encoding='utf-8') as jsonf:
        jsonString = json.dumps(jsonArray, indent=4)
        jsonf.write(jsonString)

從 csv 讀取數據並將日期字符串轉換為時間戳並將其添加到字典之前,我想使用 transform_date(ts) function 。

任何建議如何使用它,可能嗎?

我推薦使用 Pandas 庫,它非常健壯,可能是使用 python 操作數據的首選方式。 下面我們簡單地從字典中生成數據框。 您可以在注釋代碼中看到如何使用 pd.read_csv 讀取pd.read_csv

import pandas as pd


df = pd.DataFrame({
    'bflag':[True, False],
    'date':['10/8/2022', '11/8/2022']
})

# or from file
# df = pd.read_csv("path/to/file")

df['timestamp'] = df['date'].apply(lambda x : pd.Timestamp(x).timestamp())
df.head()

function pd.Timestamp() 由 pandas 提供。 我們將 lambda function “應用”到“日期”系列的每一行。 The lambda function converts string to a timestamp object, and returns the.timestamp() value of that object to be saved in a new series called timestamp.

這是 output

    bflag   date    timestamp
0   True    10/8/2022   1.665187e+09
1   False   11/8/2022   1.667866e+09

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Timestamp.timestamp.html

現在對於 Json,您想要的 output 看起來無效,因為您的 dicts 不在列表中或者它們沒有密鑰。 您可以使用 pandas 生成有效的 json,每個 dict 都有一個密鑰。

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_json.html

您可以將 path_or_buf 參數添加到 to_json 以寫入文件而不是字符串。

print(df[['bflag', 'timestamp']].to_json(orient='index'))

# prints {"0":{"bflag":true,"timestamp":1665187200.0},"1":{"bflag":false,"timestamp":1667865600.0}}

我認為使用 pandas 很容易完成你正在嘗試的事情。 轉換為時間戳是 answert here

# Input:
df = pd.read_table(
        StringIO("""bFlag   date
TRUE    10/8/2022
FALSE   11/8/2022"""), parse_dates=['date'])

# you read your input from csv file, you want to do something like this:
# df = pd.read_csv(csvfilepath, parse_dates=['date'])

# converting datetime to timestamp
df['date'] = df['date'].values.astype(np.int64) // 10 ** 9
print(df)

Output df

   bFlag         date
0   TRUE   1665187200
1  FALSE   1667865600

然后使用帶有records方向的to_json將您的df轉換為 json(請參閱有關構建 json 數據的不同方式的文檔

res = df.to_json(orient='records')
print(res)

Output:

[
    {
    "bFlag ": "TRUE ", 
    "date": 1665187200
    }, 
    {
        "bFlag ": "FALSE ", 
        "date": 1667865600
    }
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM