如何将日期时间分为日期和秒

2024-06-09 09:34:24 发布

您现在位置:Python中文网/ 问答频道 /正文

假设有一个变量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)把它改成了datetime。输出为

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)

如果我想把datetime分为两部分,即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,......])

有没有一个有效的方法来处理它?你知道吗


Tags: datetimedatetime数组currentarrayvariableclass
2条回答

如果你追求的是效率,不要使用对象数组。改用numpy的内置datetime64数据类型。你知道吗

据我所知,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数据类型。(不确定此处是否存在任何平台依赖关系。检查您的环境以确定。)

得到唯一的日期

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])

“有效率”是一个主观术语。你知道吗

我看不出有什么问题

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数组。你知道吗

相关问题 更多 >