将字符串类型的CSV行日期记录转换为unixstamp并加载到json-Python中



我正在尝试将csv中的日期转换为Unix戳并加载到json 中

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

期望输出:

{
{
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(函数,并将日期字符串转换为时间戳,然后再将其添加到字典中。

有什么建议可以使用这个吗?

我认为使用panda可以很容易地完成您正在尝试的任务。转换为时间戳在这里回答。

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

输出df:

bFlag         date
0   TRUE   1665187200
1  FALSE   1667865600

然后使用to_jsondf转换为json,方向为records(请参阅有关构建json数据的不同方法的文档(

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

输出:

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

我建议使用Pandas库,它非常健壮,可能是使用python操作数据的首选方式。下面我们简单地从字典中生成数据帧。您可以在注释代码中看到如何使用pd.read_csv读取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()

函数pd.Timestamp((由panda提供。我们"应用";将lambda函数添加到"date"系列的每一行。lambda函数将字符串转换为时间戳对象,并返回该对象的.timestamp((值,该值将保存在名为timestamp的新序列中。

这是输出

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,您想要的输出看起来是无效的,因为您的dict不在列表中,或者它们没有键。您可以使用panda生成有效的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}}

最新更新