जब मैं उन्हें डेटाटाइमइंडेक्स के रूप में असाइन करता हूं तो मेरी टाइमरीज़ तिथियां (दिन/माह) गड़बड़ हो रही हैं। अजीब लगता है कि पार्सर इसे इतना गलत कर सकता है, लेकिन प्रारूप घोषित करने और डेफर्स्ट का उपयोग करने का प्रयास किया है लेकिन कुछ भी काम नहीं कर रहा है।
#input_data = pd.read_csv(url)
input_data = pd.read_csv(url,usecols=['Dates','TYAFWD Comdty'],skiprows=None, parse_dates=True, nrows=1500)
# Set Date as Index, clean dataframe
input_data = input_data.set_index('Dates')
df = pd.DataFrame(input_data).dropna()
print(df.columns)
# Create new Date index
data_time = pd.to_datetime(df.index)
datetime_index = pd.DatetimeIndex(data_time.values)
df = df.set_index(datetime_index)
df.index = pd.to_datetime(df.index, infer_datetime_format='%Y/%m/%d' )
df['year'] = pd.DatetimeIndex(df.index).year
df['month'] = pd.DatetimeIndex(df.index).month
df['week'] = pd.DatetimeIndex(df.index).weekofyear
print(df.head(30))
आउटपुट से देख सकते हैं कि यह सब मिला हुआ है। मुझे उम्मीद है कि आउटपुट में सभी प्रविष्टियां मई, 5 वें महीने में होंगी, लेकिन यह एक बार <12 तारीखों को फ़्लिप कर रहा है
यहाँ मेरा कच्चा डेटा है: https://raw.githubusercontent.com/esheehan1/projects/master/BB_FUT_DATA। सीएसवी
Index(['TYAFWD Comdty'], dtype='object')
TYAFWD Comdty year month week
2020-05-26 0.508 2020 5 22
2020-05-25 0.494 2020 5 22
2020-05-22 0.494 2020 5 21
2020-05-21 0.508 2020 5 21
2020-05-20 0.512 2020 5 21
2020-05-19 0.512 2020 5 21
2020-05-18 0.552 2020 5 21
2020-05-15 0.483 2020 5 20
2020-05-14 0.474 2020 5 20
2020-05-13 0.494 2020 5 20
2020-12-05 0.510 2020 12 49
2020-11-05 0.548 2020 11 45
2020-08-05 0.527 2020 8 32
2020-07-05 0.494 2020 7 27
2020-06-05 0.568 2020 6 23
2020-05-05 0.541 2020 5 19
3 जवाब
कोड लिखने से पहले (यदि आप कर सकते हैं) लिखने से पहले अपने कच्चे डेटा को देखना हमेशा एक अच्छा विचार है।
आपके विशेष मामले में दिनांक प्रारूप डी/एम/वाई है जो अंतर्राष्ट्रीय और यूरोपीय मानक है। फ़ंक्शन pd.read_csv
डिफ़ॉल्ट रूप से अमेरिकी दिनांक प्रारूप M/D/Y का उपयोग करता है।
पैरामीटर dayfirst=True
का उपयोग करके इसे बदलने से आपका वांछित आउटपुट मिलेगा। साथ ही, मैंने आपका कोड थोड़ा छोटा कर दिया है:
import pandas as pd
from datetime import date
url = 'https://raw.githubusercontent.com/esheehan1/projects/master/BB_FUT_DATA.csv'
df = pd.read_csv(url, usecols=['Dates','TYAFWD Comdty'], index_col=['Dates'], skiprows=None, parse_dates=True, dayfirst=True, nrows=1500)
print(df.iloc[15:20,:])
TYAFWD Comdty
Dates
2020-05-05 0.541
2020-05-04 0.527
2020-05-01 0.512
2020-04-30 0.528
2020-04-29 0.521
अपने वांछित कॉलम जोड़ें:
df['year'] = pd.to_datetime(df.index).year
df['month'] = pd.to_datetime(df.index).month
df['week'] = pd.to_datetime(df.index).weekofyear
print(df.iloc[15:20,:])
TYAFWD Comdty year month week
Dates
2020-05-05 0.541 2020 5 19
2020-05-04 0.527 2020 5 19
2020-05-01 0.512 2020 5 18
2020-04-30 0.528 2020 4 18
2020-04-29 0.521 2020 4 18
Pd के लिए pandas प्रलेखन देखें। read_csv ऐसे कई पैरामीटर हैं जो आपको उपयोगी लग सकते हैं!
मुझे आपके आउटपुट में कुछ भी गलत नहीं दिख रहा है।
ऐसा लगता है कि .to_datetime()
का डिफ़ॉल्ट व्यवहार है। यह डिफ़ॉल्ट रूप से अवरोही क्रम year
, month
, day
में फॉमेट करता है। यह "मानक" है।
हालांकि, यदि आप यह सुनिश्चित करना चाहते हैं कि डेटा ठीक से रूपांतरित हो, तो तर्क format
का उपयोग करें;
df.index = df.index.to_datetime(format='%d/%m/%Y')
# that's it
pd.read_csv
में डिफ़ॉल्ट डेटाटाइम स्वरूपण आपकी समस्या का कारण बनता है, क्योंकि यह मानता है कि /
-पृथक स्वरूपण %m/%d/%Y
है। मैं यह भी सुझाव दूंगा कि आप अपने कोड को थोड़ा सा सरल करें, क्योंकि इस समय बहुत सारे अनावश्यक कास्टिंग ऑपरेशन हैं:
import pandas as pd
# Result is a DataFrame already
df = pd.read_csv('BB_FUT_DATA.csv', usecols=['Dates', 'TYAFWD Comdty'], skiprows=None, nrows=1500)
df.dropna(inplace=True)
df.Dates = pd.to_datetime(df.Dates, format='%d/%m/%Y')
df.set_index('Dates', inplace=True)
# Since df.index is already of type datetime you can access the year, month, weekofyear attributes directly
df['year'] = df.index.year
df['month'] = df.index.month
df['week'] = df.index.weekofyear
print(df.head(30))
वैकल्पिक रूप से आप इसे पूरी तरह से pd.read_csv
में dayfirst=True
(जैसा कि @eNc ने बताया) या date_parser=lambda x: pd.to_datetime(x, format='%d/%m/%Y')
और na_filter
का उपयोग करके NaN और NA मानों वाली पंक्तियों को छोड़ने के लिए कर सकते हैं:
import pandas as pd
df = pd.read_csv(
'BB_FUT_DATA.csv',
usecols=['Dates', 'TYAFWD Comdty'],
parse_dates=True,
dayfirst=True,
skiprows=None,
nrows=1500,
index_col='Dates',
na_filter=True
)
df['year'] = df.index.year
df['month'] = df.index.month
df['week'] = df.index.weekofyear
print(df.head(30))
आउटपुट:
TYAFWD Comdty year month week
Dates
2020-05-26 0.508 2020 5 22
2020-05-25 0.494 2020 5 22
2020-05-22 0.494 2020 5 21
2020-05-21 0.508 2020 5 21
2020-05-20 0.512 2020 5 21
2020-05-19 0.512 2020 5 21
2020-05-18 0.552 2020 5 21
2020-05-15 0.483 2020 5 20
2020-05-14 0.474 2020 5 20
2020-05-13 0.494 2020 5 20
2020-05-12 0.510 2020 5 20
2020-05-11 0.548 2020 5 20
2020-05-08 0.527 2020 5 19
2020-05-07 0.494 2020 5 19
2020-05-06 0.568 2020 5 19
2020-05-05 0.541 2020 5 19
2020-05-04 0.527 2020 5 19
2020-05-01 0.512 2020 5 18
2020-04-30 0.528 2020 4 18
2020-04-29 0.521 2020 4 18
2020-04-28 0.519 2020 4 18
2020-04-27 0.559 2020 4 18
2020-04-24 0.518 2020 4 17
2020-04-23 0.512 2020 4 17
2020-04-22 0.514 2020 4 17
2020-04-21 0.474 2020 4 17
2020-04-20 0.490 2020 4 17
2020-04-17 0.521 2020 4 16
2020-04-16 0.510 2020 4 16
2020-04-15 0.498 2020 4 16