爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 3712|回复: 10

[经验总结] nc数据世界时转北京时间,请高手切磋,写的菜

[复制链接]

新浪微博达人勋

发表于 2023-6-13 16:50:50 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 主啊 于 2023-6-14 00:23 编辑

import xarray as xr
import netCDF4 as nc
import datetime as dt
import pandas as pd
from datetime import datetime, timedelta

timefile = 'E:/xinzheng2021-2022/2021year01-03day0-23h.nc'
data = xr.open_dataset(timefile)
f = []

for i in data["time"].values:
    print("before",i)
i = dt.datetime.strptime(str(i)[0:-10], '%Y-%m-%dT%H:%M:%S')
    i = i + dt.timedelta(hours=8)
    print("after")
    print(i)
    i = i.strftime('%Y-%m-%dT%H:%M:%S')
    f.append(i)

print("*"*60)
print(f)

time = f
tsc = data.Temperature_height_above_ground
lat = tsc.lat
lon = tsc.lon
tt = xr.DataArray(tsc, coords=[time,lat,lon], dims=['time','lat','lon'])
print(tt.time)

tt.to_netcdf('E:/xinzheng2021-2022/2021-12(beijingtime).nc')

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2023-6-13 17:37:55 | 显示全部楼层
本帖最后由 付亚男 于 2023-6-13 17:39 编辑
  1. import xarray as xr
  2. import pandas as pd

  3. fnm = r'F:/meteo_data/era5/ear5_single_levels_2021071400_2021072218.nc'
  4. ds = xr.open_dataset(fnm)

  5. t_bst = [pd.Timestamp(t, tz='UTC').tz_convert('Asia/Shanghai') for t in ds.time.values]

  6. ds_new = ds.assign_coords({'time': t_bst})
复制代码

密码修改失败请联系微信:mofangbao
回复 支持 3 反对 0

使用道具 举报

新浪微博达人勋

发表于 2023-6-13 18:09:02 | 显示全部楼层

原来还可以这么用,学到了!!!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-6-14 09:58:13 | 显示全部楼层
用MATLAB写的:

  1. function [t_new] = nctime(file_path,name)
  2. % 将nc文件里的时间转变为正常使用的时间
  3. % 输入文件路径和时间的变量名
  4. % 输出yyyy-mm-dd HH:MM:SS格式的时间

  5. nc_time=double(ncread(file_path,name));% 读取nc时间;
  6. time_info=ncreadatt(file_path,name,'units');%读取nc时间的信息;

  7. %% 初始时间和单位
  8. blanks_location = find(time_info==' ');%从time_info中找到空格的位置,用于分开单位,年月日,时分秒
  9. t0 = datetime(time_info(blanks_location(2)+1:end)); %找到起始时间并转化为datetime格式

  10. time_unit = time_info(1:blanks_location(1)-1);%找到时间单位

  11. %% 处理时间
  12. switch time_unit
  13.         % 如果单位是days,那么所读取到的数字nc_time的单位就是天
  14.         % 所以可以将nc_time转换为calduration
  15.         % 然后加在t0上,就成为了实际时间
  16.         % 其他的同理
  17.         case 'years'
  18.                 tt = calyears(nc_time);
  19.         case 'months'
  20.                 tt = calmonths(nc_time);
  21.         case 'days'
  22.                 tt = caldays(nc_time);
  23.                 % 因为小时、分钟、秒是没有cal属性的,所以只能用hours、minutes、seconds
  24.         case 'hours'
  25.                 tt = hours(nc_time);
  26.         case 'minutes'
  27.                 tt = minutes(nc_time);
  28.         case 'seconds'
  29.                 tt = seconds(nc_time);
  30. end
  31. t_new = tt + t0;%返回的是一个datetime格式的时间表

  32. end
复制代码
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-6-14 11:22:55 | 显示全部楼层
  1.     ds = xr.open_dataset(nc_file_path)
  2.     time = ds.time.values+ np.timedelta64(8, 'h')
复制代码
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-6-14 11:25:47 | 显示全部楼层

原始世界时:['2023-05-24T00:00:00.000000000' '2023-05-24T01:00:00.000000000'
'2023-05-24T02:00:00.000000000' '2023-05-24T03:00:00.000000000'
'2023-05-24T04:00:00.000000000' '2023-05-24T05:00:00.000000000']

转换后的北京时:['2023-05-24T08:00:00.000000000' '2023-05-24T09:00:00.000000000'
'2023-05-24T10:00:00.000000000' '2023-05-24T11:00:00.000000000'
'2023-05-24T12:00:00.000000000' '2023-05-24T13:00:00.000000000']
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2023-6-14 11:35:32 | 显示全部楼层
yangzi88552 发表于 2023-6-14 11:25
原始世界时:['2023-05-24T00:00:00.000000000' '2023-05-24T01:00:00.000000000'
'2023-05-24T02:00:0 ...

'2023-05-24T00:00:00.000000000'

这个对应的这个格式我写也写不对,%Y-%m-%dT%H:%M:%S
不知道后面那么多的0是怎么表示
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-6-14 14:48:33 | 显示全部楼层
主啊 发表于 2023-6-14 11:35
'2023-05-24T00:00:00.000000000'

这个对应的这个格式我写也写不对,%Y-%m-%dT%H:%M:%S

你把格式转换一下就可以了
  1. time_new = pd.to_datetime(time, format='%Y-%m-%d-%H')
复制代码
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-6-14 14:51:32 | 显示全部楼层
主啊 发表于 2023-6-14 11:35
'2023-05-24T00:00:00.000000000'

这个对应的这个格式我写也写不对,%Y-%m-%dT%H:%M:%S

DatetimeIndex(['2023-05-24 08:00:00', '2023-05-24 09:00:00',
               '2023-05-24 10:00:00', '2023-05-24 11:00:00',
               '2023-05-24 12:00:00', '2023-05-24 13:00:00',
              dtype='datetime64[ns]', freq=None)


这种就是常见的样式了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2023-6-14 17:37:34 | 显示全部楼层
yangzi88552 发表于 2023-6-14 14:51
DatetimeIndex(['2023-05-24 08:00:00', '2023-05-24 09:00:00',
               '2023-05-24 10:00:00' ...

看到这个数据类型,还有个问题想请教一下:



time = pd.date_range(start="20210101", end="20210101", freq="MS")
print(time)
上面这个就是生成了这种格式:DatetimeIndex(['2021-01-01'], dtype='datetime64[ns]', freq='MS')




但是我想用这个时间,却不知道怎么转换为这DatetimeIndex,用于替换nc文件的时间,下面这样就会报错:ValueError: dimensions ('time',) must have the same length as the number of data dimensions, ndim=0



i = dt.datetime.strptime(str(tsc["time"].values)[2:-12], '%Y-%m-%dT%H:%M:%S')
i = i + dt.timedelta(hours=8)
i = i.strftime('%Y-%m-%dT%H:%M:%S')
time = pd.to_datetime(i)
tt = xr.DataArray(tsc, coords=[aa,lat,lon], dims=['time','lat','lon'])
(这个nc文件只有一个时间,替换为北京时间为20210101年0点的)

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表