使用 Pandas 读取 csv 文件时将时间戳元组解析为日期
Parse Timestamp tuple into date while reading csv file with Pandas
我有许多 CSV 文件需要解析成 Pandas 数据帧,以时间为索引。我自动解析文件usingdf = pd.read_csv("infile.csv",parse_dates=["index"],dayfirst=False)
中的日期。对于我的一些文件,这失败了,因为没有找到正确的日期格式,而是一个看起来像这样的时间戳元组:
,index,tos,model_member,member_id,model,experiment_id
0,"(0, Timestamp('1950-01-31 00:00:00'), 0)",4.740208145290402,KACE-1-0-G-r1i1p1f1_ssp245,r1i1p1f1_ssp245,KACE-1-0-G,ssp245
1,"(0, Timestamp('1950-01-31 00:00:00'), 1)",4.740208145290402,KACE-1-0-G-r1i1p1f1_ssp245,r1i1p1f1_ssp245,KACE-1-0-G,ssp245
2,"(0, Timestamp('1950-01-31 00:00:00'), 2)",4.740208145290402,KACE-1-0-G-r1i1p1f1_ssp245,r1i1p1f1_ssp245,KACE-1-0-G,ssp245
3,"(0, Timestamp('1950-01-31 00:00:00'), 3)",4.740208145290402,KACE-1-0-G-r1i1p1f1_ssp245,r1i1p1f1_ssp245,KACE-1-0-G,ssp245
我四处寻找一种在读取文件期间将其转换为日期的好方法,但我找不到。任何的意见都将会有帮助。时间戳来自从 NetCDF 文件中提取数据,然后使用 Python 库 xarray
和函数 [xarray.Dataset.to_netcdf][2]
将数据写入 CSV。如果有一种方法可以避免首先将时间戳写入文件,而是将字符串日期写入文件,我也会非常感兴趣,例如%Y-%m-%h
。我看到的问题很接近我的问题,但 对我不起作用。我目前将数据写入文件的方式是,我认为可行:
df.to_csv("filename.csv", date_format='%Y-%m-%d')
您可以在没有任何自动日期解析的情况下读取 csv,然后 extract
通过捕获 r"'(.*)'"
:
手动读取日期
df = pd.read_csv('infile.csv', index_col=0)
df['index'] = df['index'].str.extract(r"'(.*)'")
df['index'] = pd.to_datetime(df['index'])
index
tos
model_member
member_id
model
experiment_id
0
1950-01-31
4.740208
KACE-1-0-G-r1i1p1f1_ssp245
r1i1p1f1_ssp245
KACE-1-0-G
ssp245
1
1950-01-31
4.740208
KACE-1-0-G-r1i1p1f1_ssp245
r1i1p1f1_ssp245
KACE-1-0-G
ssp245
2
1950-01-31
4.740208
KACE-1-0-G-r1i1p1f1_ssp245
r1i1p1f1_ssp245
KACE-1-0-G
ssp245
3
1950-01-31
4.740208
KACE-1-0-G-r1i1p1f1_ssp245
r1i1p1f1_ssp245
KACE-1-0-G
ssp245
我有许多 CSV 文件需要解析成 Pandas 数据帧,以时间为索引。我自动解析文件usingdf = pd.read_csv("infile.csv",parse_dates=["index"],dayfirst=False)
中的日期。对于我的一些文件,这失败了,因为没有找到正确的日期格式,而是一个看起来像这样的时间戳元组:
,index,tos,model_member,member_id,model,experiment_id
0,"(0, Timestamp('1950-01-31 00:00:00'), 0)",4.740208145290402,KACE-1-0-G-r1i1p1f1_ssp245,r1i1p1f1_ssp245,KACE-1-0-G,ssp245
1,"(0, Timestamp('1950-01-31 00:00:00'), 1)",4.740208145290402,KACE-1-0-G-r1i1p1f1_ssp245,r1i1p1f1_ssp245,KACE-1-0-G,ssp245
2,"(0, Timestamp('1950-01-31 00:00:00'), 2)",4.740208145290402,KACE-1-0-G-r1i1p1f1_ssp245,r1i1p1f1_ssp245,KACE-1-0-G,ssp245
3,"(0, Timestamp('1950-01-31 00:00:00'), 3)",4.740208145290402,KACE-1-0-G-r1i1p1f1_ssp245,r1i1p1f1_ssp245,KACE-1-0-G,ssp245
我四处寻找一种在读取文件期间将其转换为日期的好方法,但我找不到。任何的意见都将会有帮助。时间戳来自从 NetCDF 文件中提取数据,然后使用 Python 库 xarray
和函数 [xarray.Dataset.to_netcdf][2]
将数据写入 CSV。如果有一种方法可以避免首先将时间戳写入文件,而是将字符串日期写入文件,我也会非常感兴趣,例如%Y-%m-%h
。我看到的问题很接近我的问题,但
df.to_csv("filename.csv", date_format='%Y-%m-%d')
您可以在没有任何自动日期解析的情况下读取 csv,然后 extract
通过捕获 r"'(.*)'"
:
df = pd.read_csv('infile.csv', index_col=0)
df['index'] = df['index'].str.extract(r"'(.*)'")
df['index'] = pd.to_datetime(df['index'])
index | tos | model_member | member_id | model | experiment_id | |
---|---|---|---|---|---|---|
0 | 1950-01-31 | 4.740208 | KACE-1-0-G-r1i1p1f1_ssp245 | r1i1p1f1_ssp245 | KACE-1-0-G | ssp245 |
1 | 1950-01-31 | 4.740208 | KACE-1-0-G-r1i1p1f1_ssp245 | r1i1p1f1_ssp245 | KACE-1-0-G | ssp245 |
2 | 1950-01-31 | 4.740208 | KACE-1-0-G-r1i1p1f1_ssp245 | r1i1p1f1_ssp245 | KACE-1-0-G | ssp245 |
3 | 1950-01-31 | 4.740208 | KACE-1-0-G-r1i1p1f1_ssp245 | r1i1p1f1_ssp245 | KACE-1-0-G | ssp245 |