Python: 将列转换为日期格式并提取顺序
Python: Convert columns into date format and extract order
我请求帮助将值转换为日期格式。
我有以下数据结构:
ID ACT1 ACT2 ACT3 ACT4
1 154438.0 154104.0 155321.0 155321.0
2 154042.0 154073.0 154104.0 154104.0
...
ACT1-4列的数字需要转换。某些行包含 NaN 值。
我发现以下函数可以帮助我获得公历日期:
from datetime import datetime, timedelta
gregorian = datetime.strptime('1582/10/15', "%Y/%m/%d")
modified_date = gregorian + timedelta(days=154438)
datetime.strftime(modified_date, "%Y/%m/%d")
很高兴知道如何将此转换应用于除 "ID" 之外的所有列,以及该方法是否正确(或可以改进)。
应用转换后,我需要提取列项的顺序,按日期升序排序。例如
ID ORDER
1 ACT1, ACT3, ACT4, ACT2
2 ACT2, ACT1, ACT3, ACT4
谢谢!
听起来你有两个问题。
1) 更改为日期时间:
cols = [col for col in df.columns if col != 'ID']
df.loc[:, cols] = df.loc[:, cols].applymap(lambda x: datetime.strptime('1582/10/15', "%Y/%m/%d") + timedelta(days=x) if np.isfinite(x) else x)
2) 获取排序后的列名:
df['ORDER'] = df.loc[:, cols].apply(lambda dr: ','.join(df.loc[:, cols].columns[dr.dropna().argsort()]), axis=1)
注意:上面的 dropna 将从订单字符串中省略带有 NaT 值的列。
首先,我将输入列用逗号分隔,这样更容易处理以下形式:
ID,ACT1,ACT2,ACT3,ACT4
1,154438.0,154104.0,155321.0,155321.0
2,154042.0,154073.0,154104.0,154104.0
然后您可以使用 CSV reader 读取每一行,提取以您的列名作为键的键值对。然后从该字典中弹出 ID 以获取其值,即 1,2 等。然后您可以根据日期值重新排序。代码如下:
#!/usr/bin/env python3
import csv
from operator import itemgetter
idAndTuple = {}
with open('time.txt') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
myID = row.pop('ID',None)
reorderedList = sorted(row.items(), key = itemgetter(1))
idAndTuple[myID] = reorderedList
print( myID, reorderedList )
你运行的结果是:
1 [('ACT2', '154104.0'), ('ACT1', '154438.0'), ('ACT3', '155321.0'), ('ACT4', '155321.0')]
2 [('ACT1', '154042.0'), ('ACT2', '154073.0'), ('ACT3', '154104.0'), ('ACT4', '154104.0')]
我认为这就是您要找的。
我请求帮助将值转换为日期格式。
我有以下数据结构:
ID ACT1 ACT2 ACT3 ACT4
1 154438.0 154104.0 155321.0 155321.0
2 154042.0 154073.0 154104.0 154104.0
...
ACT1-4列的数字需要转换。某些行包含 NaN 值。
我发现以下函数可以帮助我获得公历日期:
from datetime import datetime, timedelta
gregorian = datetime.strptime('1582/10/15', "%Y/%m/%d")
modified_date = gregorian + timedelta(days=154438)
datetime.strftime(modified_date, "%Y/%m/%d")
很高兴知道如何将此转换应用于除 "ID" 之外的所有列,以及该方法是否正确(或可以改进)。
应用转换后,我需要提取列项的顺序,按日期升序排序。例如
ID ORDER
1 ACT1, ACT3, ACT4, ACT2
2 ACT2, ACT1, ACT3, ACT4
谢谢!
听起来你有两个问题。
1) 更改为日期时间:
cols = [col for col in df.columns if col != 'ID']
df.loc[:, cols] = df.loc[:, cols].applymap(lambda x: datetime.strptime('1582/10/15', "%Y/%m/%d") + timedelta(days=x) if np.isfinite(x) else x)
2) 获取排序后的列名:
df['ORDER'] = df.loc[:, cols].apply(lambda dr: ','.join(df.loc[:, cols].columns[dr.dropna().argsort()]), axis=1)
注意:上面的 dropna 将从订单字符串中省略带有 NaT 值的列。
首先,我将输入列用逗号分隔,这样更容易处理以下形式:
ID,ACT1,ACT2,ACT3,ACT4
1,154438.0,154104.0,155321.0,155321.0
2,154042.0,154073.0,154104.0,154104.0
然后您可以使用 CSV reader 读取每一行,提取以您的列名作为键的键值对。然后从该字典中弹出 ID 以获取其值,即 1,2 等。然后您可以根据日期值重新排序。代码如下:
#!/usr/bin/env python3
import csv
from operator import itemgetter
idAndTuple = {}
with open('time.txt') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
myID = row.pop('ID',None)
reorderedList = sorted(row.items(), key = itemgetter(1))
idAndTuple[myID] = reorderedList
print( myID, reorderedList )
你运行的结果是:
1 [('ACT2', '154104.0'), ('ACT1', '154438.0'), ('ACT3', '155321.0'), ('ACT4', '155321.0')]
2 [('ACT1', '154042.0'), ('ACT2', '154073.0'), ('ACT3', '154104.0'), ('ACT4', '154104.0')]
我认为这就是您要找的。