You can read the contents of the file using \read. If you want to put the entries into \pgfkeys the first problem you have it that pgf keys need to be initialised. You can get around this by defining an unknown handler:
\usepackage{pgfkeys}
\pgfkeys{/cycles/.is family, cycles,
% allow arbitrary unknown keys and set with \pgfkeyssetvalue
.unknown/.code={\pgfkeyssetvalue{\pgfkeyscurrentpath/\pgfkeyscurrentname}{#1}},
}
In fact, this is all you for the definition of \pgfkeys{/cycles}. What this does is set the value of a key that is unknown. As a bonus, you can use \pgfkeysifdefined to test if a key is defined, so the \printcycle command can be defined as:
\newcommand\printcycle[1]{% print the key if it is defined and ??? otherwise
\pgfkeysifdefined{/cycles/#1}{\pgfkeysvalueof{/cycles/#1}}{???}%
}
Notice that ??? is printed if the key is not known (i.e. the key is not in the data file).
Now it remains to read in the file and put the data into \pgfkeys{/cycles}. I used \SplitList from the xparse package to split an input line like A01, Cycle A Morning Summer into a key and its value and then there are some annoying expansion issues into order to get the keys to play nice - and you have to check for empty lines and lines consisting of \par as well, so this complicates the reading a little.
The code below defines a macro \ReadCycles for reading the data. The MWe produces:

Here is the full code:
\RequirePackage{filecontents}% write the data file
\begin{filecontents}{cycles.csv}
A01,Cycle A Morning Summer
A02,Cycle A2 Night
AC1,Not a defined 1st cycle
Z01,Last cycle
\end{filecontents}
\documentclass{article}
\usepackage{xparse}% mainly for \SplitList
\usepackage{pgfkeys}
\pgfkeys{/cycles/.is family, cycles,
% allow arbitrary unknown keys and set with \pgfkeyssetvalue
.unknown/.code={\pgfkeyssetvalue{\pgfkeyscurrentpath/\pgfkeyscurrentname}{#1}},
}
\newcommand\printcycle[1]{% print the key if it is defined and ??? otherwise
\pgfkeysifdefined{/cycles/#1}{\pgfkeysvalueof{/cycles/#1}}{???}%
}
% split input line into key-value pair
\NewDocumentCommand{\AddCycle}{ >{\SplitList{,}} m }{%
\AddCycleValue #1
}
% put a key-value pair into \pgfkeys{/cycles}
\newcommand\AddCycleValue[2]{\expandafter\pgfkeys\expandafter{/cycles,#1=#2}}
% \ReadCycles{filename} keys the keys in <filename> into \pgfkeys{/cycles}
\newread\cyclefile% file handler
\def\apar{\par}% \ifx\par won't work but \ifx\apar will
\newcommand\ReadCycles[1]{% read file into [\pgfkeys{/cycles}
\openin\cyclefile=#1% open file for reading
\loop\unless\ifeof\cyclefile% loop until end of file
\read\cyclefile to \cycleline% read line from file
\ifx\cycleline\apar% test for \par
\else%
\ifx\cycleline\empty\relax% skip over empty lines/comments
\else\expandafter\AddCycle\expandafter{\cycleline}%
\fi%
\fi%
\repeat% end of file reading loop
\closein\cyclefile% close input file
}
\ReadCycles{cycles.csv}% read the file
\begin{document}
A01 is \printcycle{A01}
A02 is \printcycle{A02}
Z01 is \printcycle{Z01}
Z02 is \printcycle{Z02}
\end{document}
Btw, for consistency with pgfkeys, I would use = instead of , in the data file:
A01=Cycle A Morning Summer
A02=Cycle A2 Night
AC1=Not a defined 1st cycle
Z01=Last cycle
For this you just have to use \SplitList{=} above. Better still, you could replace the two macros \AddCycle and \AddCycleValue with the single macro
\newcommand\AddCycle[1]{\expandafter\pgfkeys\expandafter{/cycles, #1}}
So you would no longer need xparse.