Замена значения «NULL» в файле CSV на текущую дату — Python

В настоящее время я работаю над проектом Python, который импортирует текстовый файл данных (CSV в моем случае), а затем выводит сотрудников, которые больше всего времени работали вместе в общем проекте. Во-первых, это код и файл данных:

from collections import defaultdict
from itertools import combinations
from datetime import datetime
import csv

d = defaultdict(list)

with open("data.csv") as f:
    next(f) # skip header
    r = csv.reader(f)
    # unpack use height as key and  append name age and position
    for EmpID, ProjectID, FromDate, ToDate in r:
        d[int(ProjectID)].append((EmpID, FromDate, ToDate))

for job, aref in d.items():
    if len(aref) >= 2:
        for ref in combinations(aref, 2):
            begin = max(map(lambda x: x[1], ref))
            end = min(map(lambda x: x[2], ref))
            delta = datetime.strptime(end, '%Y-%m-%d') \
                    - datetime.strptime(begin, '%Y-%m-%d')
            dd = delta.days
            if dd > 0:
                print('Employees with EmpID:', ref[0][0], 'and', ref[1][0],
                      'worked together on a common project (Project ID:', job, ') for a total of', dd, 'days')

И это файл данных, который я импортирую:

EmpID,ProjectID,DateFrom,DateTo
1,100,2014-11-01,2015-05-01
2,101,2013-12-06,2014-10-06
3,102,2015-06-04,2017-09-04
5,103,2014-10-01,2015-12-01
2,100,2013-03-07,2015-11-07
2,103,2015-07-09,2019-01-19
4,102,2013-11-13,2014-03-13
4,103,2016-02-14,2017-03-15
5,104,2014-03-15,2015-11-09

Теперь у меня есть задача: если в столбце «DateTo» есть значение «NULL», я должен сделать его равным сегодня. Я думаю, что должна быть автоматическая функция python, которая дает текущую дату, а затем выполняет оператор if внутри блока кода CSV, чтобы заменить «NULL» сегодняшней датой (но насколько я знаю, она открыта только в режиме чтения ?). Я был бы очень признателен, если бы кто-нибудь мог дать мне какие-либо советы! Спасибо.

Обновлено: PANDAS ПРЕДЫДУЩАЯ ПОПЫТКА РЕШЕНИЯ: (выполнено на 50%)

# Load the Pandas libraries with alias 'pd'
import pandas as pd
import datetime as dt
import numpy as np
# Read data from file 'filename.csv'
# (in the same directory that your python process is based)
# Control delimiters, rows, column names with read_csv (see later)
date_parser = lambda c: pd.to_datetime(c, format='%Y/%m/%d', errors='coerce')
df = pd.read_csv('data.csv', delimiter = ',', parse_dates=[2,3], date_parser=date_parser)
df.set_index("EmpID", inplace = True)
df.sort_values(['ProjectID'], inplace=True)
df['Days Worked'] = (df['DateTo'] - df['DateFrom']).dt.days
cutdown_projecs = df.groupby('ProjectID').filter(lambda x: len(x) >= 2)

print(cutdown_projecs)

Вам нужно прочитать из этого файла и записать во второй файл, таким образом, откройте 2 файла

bagerard 30.05.2019 12:10

@jezrael Я уже пробовал решение Pandas заранее, я могу показать вам свой прогресс. Я просто не был знаком с пакетом и операциями, которые я могу выполнять с фреймворком данных, поэтому решил использовать традиционные методы Python.

Gergan Zhekov 30.05.2019 12:19

@jezrael Да, все решено. Спасибо.

Gergan Zhekov 30.05.2019 13:14

@GerganZhekov - супер, удачи.

jezrael 30.05.2019 13:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
4
1 688
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

использовать fillna

import pandas as pd
from io import StringIO
from datetime import datetime

document = '''
EmpID,ProjectID,DateFrom,DateTo
1,100,2014-11-01,2015-05-01
2,101,2013-12-06,2014-10-06
3,102,2015-06-04,2017-09-04
5,103,2014-10-01,2015-12-01
2,100,2013-03-07,NULL
2,103,2015-07-09,2019-01-19
4,102,2013-11-13,2014-03-13
4,103,2016-02-14,2017-03-15
5,104,2014-03-15,2015-11-09'''

# df = pd.read_csv('data.csv')

df = pd.read_csv(StringIO(document))
df['DateTo'] = df['DateTo'].fillna(datetime.today().strftime('%Y-%m-%d'))
print(df)

   EmpID  ProjectID    DateFrom      DateTo
0      1        100  2014-11-01  2015-05-01
1      2        101  2013-12-06  2014-10-06
2      3        102  2015-06-04  2017-09-04
3      5        103  2014-10-01  2015-12-01
4      2        100  2013-03-07  2019-05-30
5      2        103  2015-07-09  2019-01-19
6      4        102  2013-11-13  2014-03-13
7      4        103  2016-02-14  2017-03-15
8      5        104  2014-03-15  2015-11-09

Спасибо! Можно ли использовать pandas для создания этого, а затем снова экспортировать его в CSV (который будет новым), который затем будет открыт из моего кода?

Gergan Zhekov 30.05.2019 12:09

да, вы можете это сделать. зависит от того, как вы хотите его использовать

Nihal 30.05.2019 12:09

В вашем коде можно использовать if-else с условием для проверки пустых значений строковых значений и замены на сегодняшнюю дату и время без времени:

import pandas as pd

end = min(map(lambda x: x[2], ref))
end = datetime.strptime(end, '%Y-%m-%d') if end != '' else pd.Timestamp("today").floor('d')
delta = end - datetime.strptime(begin, '%Y-%m-%d')

Другие вопросы по теме