<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def align(self, per_series_aligner, seconds=0, minutes=0, hours=0):
 """Copy the query and add temporal alignment. If ``per_series_aligner`` is not :data:`Aligner.ALIGN_NONE`, each time series will contain data points only on the period boundaries. Example:: from google.cloud.monitoring import enums query = query.align( enums.Aggregation.Aligner.ALIGN_MEAN, minutes=5) It is also possible to specify the aligner as a literal string:: query = query.align('ALIGN_MEAN', minutes=5) :type per_series_aligner: str or :class:`~google.cloud.monitoring_v3.gapic.enums.Aggregation.Aligner` :param per_series_aligner: The approach to be used to align individual time series. For example: :data:`Aligner.ALIGN_MEAN`. See :class:`~google.cloud.monitoring_v3.gapic.enums.Aggregation.Aligner` and the descriptions of the `supported aligners`_. :type seconds: int :param seconds: The number of seconds in the alignment period. :type minutes: int :param minutes: The number of minutes in the alignment period. :type hours: int :param hours: The number of hours in the alignment period. :rtype: :class:`Query` :returns: The new query object. .. _supported aligners: https://cloud.google.com/monitoring/api/ref_v3/rest/v3/\ projects.timeSeries/list#Aligner """

        new_query = copy.deepcopy(self)
        new_query._per_series_aligner = per_series_aligner
        new_query._alignment_period_seconds = seconds + 60 * (minutes + 60 * hours)
        return new_query