Skip to content

Instantly share code, notes, and snippets.

@mikkohei13
Last active February 1, 2024 13:41
Show Gist options
  • Save mikkohei13/7c8c6297d163c0ba9c8f6f98eb669dc2 to your computer and use it in GitHub Desktop.
Save mikkohei13/7c8c6297d163c0ba9c8f6f98eb669dc2 to your computer and use it in GitHub Desktop.
Script to convert CSV tabular file to FinBIF data bank format
"""
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