Last active
February 1, 2024 13:41
-
-
Save mikkohei13/7c8c6297d163c0ba9c8f6f98eb669dc2 to your computer and use it in GitHub Desktop.
Script to convert CSV tabular file to FinBIF data bank format
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Script to make conversions to a CSV tabular file containing bird species observations (occurrence records) | |
Data format sample (mock data): | |
ID;pvm;aika;laji;lkm;ykj_p;ykj_i;pesimävarmuusindeksi | |
2021_A;01.02.2021;07:50;teeri;2;7100000;3390000;2 | |
2021_B;01.05.2021;09:18;heinäsorsa;12;6900000;3410000;2 | |
2021_C;13.02.2021;09:37;riekko;NaN;7100000;3470000;3 | |
2021_D;02.02.2021;07:16;fasaani;NA;6710000;3410000;2 | |
2021_E;11.04.2021;09:06;riekko;4;7580000;3360000;2 | |
The final file should contain the following columns: | |
ID - Havaintoerä | |
Havainnoijat - Yleinen keruutapahtuma | |
Alku - Yleinen keruutapahtuma | |
Koordinaatit@N - Keruutapahtuma | |
Koordinaatit@E - Keruutapahtuma | |
Koordinaatit@System - Keruutapahtuma | |
Laji - Määritys | |
Määrä - Havainto | |
Pesimävarmuusindeksi - Havainto | |
""" | |
import pandas | |
# Function to load csv file using semicolons as separators into Pandas DataFrame | |
def load_csv(filename): | |
df = pandas.read_csv(filename, sep=';', encoding='utf-8') | |
return df | |
filename = 'sample.csv' | |
filename = 'OR_havainnot_lintuatlakseen_2022_tarkastettu.csv' | |
filename = 'OR_havainnot_lintuatlakseen_2023_tarkastettu.csv' | |
df = load_csv(filename) | |
# Convert date (pvm) column to datetime format YYYY-MM-DD | |
df['pvm'] = pandas.to_datetime(df['pvm'], format='%d.%m.%Y').dt.strftime('%Y-%m-%d') | |
# Combine date (pvm) and time (aika) columns to a single column "Alku - Yleinen keruutapahtuma" datetime format YYYY-MM-DD'T'HH:MM:SS | |
df['Alku - Yleinen keruutapahtuma'] = df['pvm'] + 'T' + df['aika'] + ':00' | |
# If aika field is missing leading hour digit, add it (e.g. 9:50 -> 09:50) | |
df['aika'] = df['aika'].apply(lambda x: '0' + x if len(x) == 4 else x) | |
# Remove columns pvm and aika | |
df.drop(['pvm', 'aika'], axis=1, inplace=True) | |
# On lkm field, replace NA values with empty string | |
df['lkm'] = df['lkm'].fillna('') | |
# On lkm field, convert decimal values to integer. Ignore empty strings. | |
df['lkm'] = df['lkm'].apply(lambda x: int(float(x)) if x != '' else x) | |
# On pesimävarmuusindeksi field, replace NA values with empty string | |
df['pesimävarmuusindeksi'] = df['pesimävarmuusindeksi'].fillna('') | |
# On pesimävarmuusindeksi field, convert decimal values to integer. Ignore empty strings. | |
df['pesimävarmuusindeksi'] = df['pesimävarmuusindeksi'].apply(lambda x: int(float(x)) if x != '' else x) | |
# Keep only first 3 numbers of ykj_p and ykj_i columns (e.g. 6720000 -> 672) | |
df['ykj_p'] = df['ykj_p'].apply(lambda x: str(x)[:3]) | |
df['ykj_i'] = df['ykj_i'].apply(lambda x: str(x)[:3]) | |
# Add column "Koordinaatit@System - Keruutapahtuma" with value "ykj" | |
df['Koordinaatit@System - Keruutapahtuma'] = 'ykj' | |
# Add column "Havainnoijat - Yleinen keruutapahtuma" with value "Anonyymi" | |
df['Havainnoijat - Yleinen keruutapahtuma'] = 'Anonyymi' | |
# Remove rows that have NaN values on id column | |
df.dropna(subset=['ID'], inplace=True) | |
print(df) | |
# Final step: rename columns | |
# Rename laji to "Laji - Määritys" | |
df.rename(columns={'laji': 'Laji - Määritys'}, inplace=True) | |
# Rename pesimävarmuusindeksi to "Pesimävarmuusindeksi - Havainto" | |
df.rename(columns={'pesimävarmuusindeksi': 'Pesimävarmuusindeksi - Havainto'}, inplace=True) | |
# Rename ID to "ID - Havaintoerä" | |
df.rename(columns={'ID': 'ID - Havaintoerä'}, inplace=True) | |
# Rename lkm to "Lukumäärä - Yleinen keruutapahtuma" | |
df.rename(columns={'lkm': 'Määrä - Havainto'}, inplace=True) | |
# Rename ykj_p and ykj_i to "Koordinaatit@N - Keruutapahtuma" and "Koordinaatit@E - Keruutapahtuma" | |
df.rename(columns={'ykj_p': 'Koordinaatit@N - Keruutapahtuma', 'ykj_i': 'Koordinaatit@E - Keruutapahtuma'}, inplace=True) | |
print(df) | |
# Save the file as csv file UTF-8 with BOM, using filename with prefix "converted_" | |
df.to_csv('converted_' + filename, sep=';', encoding='utf-8-sig', index=False) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment