【问题标题】:How to separate a datetime into date and seconds如何将日期时间分成日期和秒
【发布时间】:2018-09-14 09:18:45
【问题描述】:

假设有一个变量time,即

<class 'netCDF4._netCDF4.Variable'>
int32 time(time)
    units: seconds since 1955-01-01
unlimited dimensions: time
current shape = (1464,)
filling off

我已经用 time = nc.num2date(time[:],time.units) 将其更改为日期时间。输出是

array([datetime.datetime(2012, 1, 1, 0, 0),
       datetime.datetime(2012, 1, 1, 6, 0),
       datetime.datetime(2012, 1, 1, 12, 0), ...,
       datetime.datetime(2012, 12, 31, 6, 0),
       datetime.datetime(2012, 12, 31, 12, 0),
       datetime.datetime(2012, 12, 31, 18, 0)], dtype=object)

如果我想将日期时间分成两部分,即date == the current date as 8 digit integer (YYYYMMDD)datesec == seconds to complete current date。例如,
这个数组可以分成两个数组(datedatesec

date = array([20120101,20120101,20120101,20120101,
              20120102,20120102,...])

datesec = array ([0,21600,43200,64800,
                  0,21600,43200,64800,
                  0, 21600,43200,......])

有没有有效的处理方法?

【问题讨论】:

  • 列表理解+日期时间方法来获取年、月、日和秒。你尝试了什么?
  • datetime 类型有方法datetime。我不知道您为什么要将日期转换为 8 位整数,而不是将它们保留为某种实际可用的日期,您可以对其进行算术运算(例如自纪元以来的儒略日)或有用的 |S8 字符串,但是这很容易用几行算术来完成,或者只做字符串并在上面调用int。有时,只需减去午夜并致电total_seconds
  • datetime 文档展示了如何提取这些部分并将它们组合成您想要的格式。你被困在哪里了?

标签: python arrays numpy datetime netcdf


【解决方案1】:

“高效”是一个主观术语。

我看不出有什么问题

date = np.array([int(dt.strftime('%y%m%d')) for dt in time])

today_midnight = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
datesec = np.array([int((dt - today_midnight).total_seconds()) for dt in time])

第一个似乎不是很有用,尤其是作为一个 numpy 数组。

【讨论】:

  • 看来datesec数组的输出不是seconds to complete current date
【解决方案2】:

如果您追求的是效率,请不要使用对象数组。请改用 numpy 的内置 datetime64 dtype。

据我所知,datetime64 使用起来不如datetime 舒服,但它可以完成工作。

据我了解,您必须手动进行转换。基于元数据类似

timestamps = np.datetime64('1955-01-01') + your_int32_raw_data_array.astype('m8[s]')

应该会导致

timestamps
# array(['2012-01-01T00:00:00', '2012-01-01T06:00:00',
#        '2012-01-01T12:00:00', ..., '2012-12-31T06:00:00',
#        '2012-12-31T12:00:00', '2012-12-31T18:00:00'],
#       dtype='datetime64[s]')

现在,例如,获取每一天的秒数:

timestamps - timestamps.astype('M8[D]')
# array([    0, 21600, 43200, ..., 21600, 43200, 64800], dtype='timedelta64[s]')

如果需要,可以将其视图转换为 int64 dtype。 (不确定这里是否有任何平台依赖。请检查您的环境以确保。)

获取唯一的日期

timestamps.astype('M8[D]')
# array(['2012-01-01', '2012-01-01', '2012-01-01', ..., '2012-12-31',
#        '2012-12-31', '2012-12-31'], dtype='datetime64[D]')

np.datetime_as_string(timestamps, 'D')
# array(['2012-01-01', '2012-01-01', '2012-01-01', ..., '2012-12-31',
#        '2012-12-31', '2012-12-31'], dtype='<U28')

如果您绝对希望它采用 6 位整数形式

year = timestamps.astype('M8[Y]') - np.datetime64('2000')
month = timestamps.astype('M8[M]') - timestamps.astype('M8[Y]') + 1
day = timestamps.astype('M8[D]') - timestamps.astype('M8[M]') + 1

10000 * year.view(np.int64) + 100 * month.view(np.int64) + day.view(np.int64)
# array([120101, 120101, 120101, ..., 121231, 121231, 121231])

【讨论】:

  • 抱歉又给您添麻烦了。我不太能掌握astype 的用法。比如time的单位是days since 2000-01-01time=[4627.0625 4627.1875 4627.3125 4627.4375 4627.5625 4627.6875 4627.8125 4627.9375]。使用nc.num2date(time[:],time.units),我们可以得到相似的日期时间。但是如果我想拆分datedatesec,我应该如何修改astype
  • @AllenZhang 执行time = np.datetime64('2001-01-01') + (np.array(time)*24*60*60).astype('m8[s]') 之类的操作,然后像以前一样继续。
猜你喜欢
  • 1970-01-01
  • 2019-09-23
  • 2021-11-08
  • 2017-12-21
  • 2017-06-16
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多