В настоящее время я работаю над проектом 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)
@jezrael Я уже пробовал решение Pandas заранее, я могу показать вам свой прогресс. Я просто не был знаком с пакетом и операциями, которые я могу выполнять с фреймворком данных, поэтому решил использовать традиционные методы Python.
@jezrael Да, все решено. Спасибо.
@GerganZhekov - супер, удачи.
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 (который будет новым), который затем будет открыт из моего кода?
да, вы можете это сделать. зависит от того, как вы хотите его использовать
В вашем коде можно использовать 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')
Вам нужно прочитать из этого файла и записать во второй файл, таким образом, откройте 2 файла