Estoy trabajando en Python y estoy usando un archivo JSON y extraigo información de él y lo envío a un archivo csv. El código que estoy usando es el siguiente:

import csv
import json

csv_kwargs = {
    'dialect': 'excel',
    'doublequote': True,
    'quoting': csv.QUOTE_MINIMAL
}

inpfile = open('checkin.json', 'r', encoding='utf-8')
outfile = open('checkin.csv', 'w', encoding='utf-8')

writer = csv.writer(outfile, **csv_kwargs, lineterminator="\n")

for line in inpfile:
    d = json.loads(line)
    writer.writerow([d['business_id'],d['date']])

inpfile.close()
outfile.close()

checkin.json valores clave de business_id y date. Los valores de date tienen la forma de 'MM:DD:YYYY HH:MM:SS' donde muestra la fecha y luego la hora. Cada business_id incluye varias fechas asociadas con él. Incluí una línea del archivo JSON para mostrar cómo funciona cada 'business_id' y las fechas asociadas con él. A continuación se muestra una línea del JSON:

{"business_id":"--1UhMGODdWsrMastO9DZw","date":"2016-04-26 19:49:16, 2016-08-30 18:36:57, 2016-10-15 02:45:18, 2016-11-18 01:54:50, 2017-04-20 18:39:06, 2017-05-03 17:58:02"}

Mi pregunta es cómo codifica esto para mantener la fecha, pero no el momento en que están en el mismo valor clave.

0
shamp7598 7 oct. 2019 a las 02:55

3 respuestas

La mejor respuesta

El formato para los valores de date descritos en su pregunta no es consistente, primero dice que es MM:DD:YYYY, sin embargo, en la línea de muestra del archivo de entrada json parece ser YYYY-MM-DD, y mientras tales detalles pueden importar, ese particular no lo hace al código revisado a continuación. Lo que hizo fue el hecho de que puede haber más de uno, por eso estoy actualizando mi respuesta.

import csv
import json

csv_kwargs = {
    'dialect': 'excel',
    'doublequote': True,
    'quoting': csv.QUOTE_MINIMAL,
}

with open('checkin.json', 'r', encoding='utf-8') as inpfile, \
     open('checkin.csv', 'w', encoding='utf-8', newline='') as outfile:

    writer = csv.writer(outfile, **csv_kwargs)

    for line in inpfile:
        d = json.loads(line)
        # Convert date value string into list of dates with the times removed.
        dates = [date.strip().split(' ')[0] for date in d['date'].split(',')]
        writer.writerow([d['business_id']] + dates)
0
martineau 7 oct. 2019 a las 16:43

Si usa estrictamente este programa para convertir el archivo json a csv, simplemente puede usar segmentos de cadena:

date, time = d['date'][:12], d['date'][12:] 

Si desea almacenarlo como un objeto datetime para hacer otra cosa

dt = time.strptime(d['date'], "'%m:%d:%Y''%H:%M:%S'")
# Other stuff
dt_string = dt.strftime("'%m:%d:%Y'")
0
Grogie 7 oct. 2019 a las 00:19

Puede analizar date en su JSON como una marca de tiempo y luego truncarlo hasta la fecha utilizando el módulo incorporado datetime de Python.

Importar el módulo:

from datetime import datetime

Analiza el date mientras escribes:

for line in inpfile:
    d = json.loads(line)

    dates  = map(lambda dt: datetime.strptime(dt.strip(), '%Y-%m-%d %H:%M:%S').strftime('%Y-%m-%d'), d['dates'].split(' '))
    for date in dates:
       writer.writerow([d['business_id'], date])
1
khan 7 oct. 2019 a las 04:03
58262146