code: def align(self, per_series_aligner, seconds=0, minutes=0, hours=0):
          
          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
docs: 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